[infona2016] 解析用データ抽出を行う時に便利なシェルコマンド

ネット上に落ちているオープンデータをうまいこと加工してプログラムが読み込みやすいようにするために使えるシェルスクリプトを紹介します。
2
ハッタリニキ @hattarist

アイマスもラブライブもごちゃ混ぜにして解析したデータ(最後のプロットは中心部の拡大図)。 昨日解析プログラムをデータ一緒にココ↓に置いとくから自分でもいろいろ解析してみてね。 dropbox.com/sh/h6ccd7yinrf… pic.twitter.com/VQYXafKb8v

2016-12-15 07:34:41
拡大
拡大
拡大
拡大
ハッタリニキ @hattarist

r10_idle_all.ipynb で使っているCSVデータの "version" というカラムにはI, C, M, Aでアイマスやラブライブの種類分けがしてあるので、それで色分けしてプロットしてみて下さい。できたら1点あげる! #infona2016

2016-12-15 07:38:08
ハッタリニキ @hattarist

@guild_eco データをダウンロードしてr10_idle_all.ipynbをいじって下さい。うまくいかない場合はzipファイルからダウンロードしてみて。これも無理やったら教えて下さい!

2016-12-15 18:56:07
ハッタリニキ @hattarist

主成分分析に使えるシェルコマンドをちょっとずつツイートしておこうかな。 まず基本の基本、grep!ファイルからkeywordが入った行を抽出してくれます。 用法1:grep keyword file 用法2:cat file | grep keyword #infona2016

2016-12-15 21:44:11
ハッタリニキ @hattarist

@gessssoul いや、サンプルは多い方が良いと思うよ。確かに全部にラベル付けたらうっとうしくなるけど、その場合は注目したい馬だけにラベル付けるとかすると良さそう。もちろん集めた中からさらに部分集合をつくって数を少なくしてから解析するのもいいと思う!

2016-12-15 21:47:11
ハッタリニキ @hattarist

文字列置換にsed。置換する先を指定しなければ単純にkeywordを消せる 用法1(hogeをfugaに置換):cat file | sed "s/hoge/fuga/g" 用法2(hogeを消す):cat file | sed "s/hoge//g" #infona2016

2016-12-15 21:50:42
ハッタリニキ @hattarist

sedを使うときはスラッシュ(/)をよく使うけど、実は@などの他の記号でもOK。 裏用法1:cat file | sed "s@hoge@fuga@g" この用法を使うとHTMLに出てくる閉じるタグ(</h1>等)をエスケープせずに済む。 #infona2016

2016-12-15 21:57:07
ハッタリニキ @hattarist

スペース区切り、カンマ区切りデータを簡単にいじるのに便利なのがawk。 a b c というスペース区切りのデータが入ったfile.txtに対して2列目だけを取り出すには 用法1:cat file.txt | awk '{print $2}' #infona2016

2016-12-15 21:59:21
ハッタリニキ @hattarist

awkの続き。カンマ区切りのデータが入ったfile.csvの中身が a,b,c の場合、 用法2:cat file.csv | awk -F, '{print $2}' -Fで区切り文字を指定できます。 #infona2016

2016-12-15 22:02:02
ハッタリニキ @hattarist

この区切り文字指定の-Fはいろいろ応用できて、ある文字列より後ろ側を切り出したいときに使える(但しその文字列が頻発しないとき) 裏用法:cat file.html | awk -F'<p>' '{print $2}' とすると一番初めの<p>タグ以降表示。 #infona2016

2016-12-15 22:04:20
ハッタリニキ @hattarist

ある列の値でソートしたいときにも使えます。print のあとに$0と書くと引数すべて吐き出すので、 10 5 3 11 4 2 に対し、 裏用法2:cat file.csv | awk '{print $2,$0}' | sort -g とすると #infona2016

2016-12-15 22:08:00
ハッタリニキ @hattarist

@hattarist 4 11 4 2 5 10 5 3 となる(2列目の値を先頭に追加)そのあと追加した2列目を消したいときは 裏用法3:cat file.csv | awk '{print $2,$0}' | sort -g | awk '{print $2,$3,$4}'

2016-12-15 22:10:43
ハッタリニキ @hattarist

データの行数が知りたかったらwc。1行目のラベル+11行のデータがあるfileに対し、 用法:wc file で出てくる一つ目の数字が行数です。 #infona2016

2016-12-15 22:15:30
ハッタリニキ @hattarist

grepの所で言い忘れましたが、-cを付けるとkeywordを含む行の出現頻度がカウントできます。(keywordの数ではないことに注意) #infona2016

2016-12-15 22:17:08
ハッタリニキ @hattarist

シェルスクリプト大好きなハッタリニキ的には、みんなにシェルでfor文を回せるようになって欲しいな。bashで 用法1:for i in {1..10}; do echo $i; done で1〜10までの数字を出力します。 #infona2016

2016-12-15 22:19:02
ハッタリニキ @hattarist

そんで、人気の高機能シェルzshだと、ゼロ埋めが簡単にできます。 裏用法(zsh):for i in {001..100}; do echo $i; done 出力は 001 002 … 100 てな感じになります。 #infona2016

2016-12-15 22:21:01
ハッタリニキ @hattarist

バッククォーテーション (`) は使えるようになるとすげー便利になるから覚えてみて。まず、この記号はシングルクォーテーション (') ともダブルクォーテーション (") とも違います。JISキーボードで@のキーをShift押しながら打つと出ます。 #infona2016

2016-12-15 22:23:33
ハッタリニキ @hattarist

このバッククォーテーションで囲むと、その中に書いたシェルコマンドを実行してくれます。これは例を書かないとわからないのでいくつかやってみます。 list=`ls` とすると、lsの実行結果がlistという変数に入ります。echo $list で中が見られます #infona2016

2016-12-15 22:27:45
ハッタリニキ @hattarist

シェルにも簡単な配列機能があって、()の中にスペース区切りのものを突っ込むと配列になります。さっきのバッククォーテーションと組み合わせて list=(`ls`) とすると、ファイルの配列ができます。アクセスするときはecho ${list[0]}とする。 #infona2016

2016-12-15 22:29:49
ハッタリニキ @hattarist

また、さっきのバッククォーテーションとfor文を組み合わせていくつかのファイルの一括処理ができます。 for file in `ls`; do echo $file; done これでlsの結果と同じものがでます。これではつまらないですが、 #infona2016

2016-12-15 22:31:46
ハッタリニキ @hattarist

for file in `ls`; do grep keyword $file; done とすると、そのディレクトリにあるファイルすべてにgrepをかけることができるようになります。 #infona2016

2016-12-15 22:32:41
ハッタリニキ @hattarist

3つ前に書いた配列と組み合わせてもう少し丁寧に書くと files=(`ls *.csv`) for file in ${files[@]}; do grep keyword $file; done みたいな感じ。今度はCSVの拡張子を持つものだけにしてみた #infona2016

2016-12-15 22:34:25
ハッタリニキ @hattarist

個人的に好きで地味によく使うのがtouch。 touch newfile でnewfileというからファイルを作成。名前をまず決めるときなどに使う。newfileが存在するときは、そのファイルの編集時刻を更新するだけなので何してもだいたい無害。 #infona2016

2016-12-15 22:37:54
ハッタリニキ @hattarist

あ、ちなみにさっきのバッククォーテーションは$()で代用ができます。 files=$(ls) みたいな使い方。 #infona2016

2016-12-15 22:41:09
ハッタリニキ @hattarist

ファイル名を取得して拡張子だけ取り除きたいようなときの書き方。 file="hoge.txt" だったとき、 echo ${file%.txt} とすると hoge が出力される。 #infona2016

2016-12-15 22:44:06