2013年12月11日水曜日

awkを使ったターミナル上の1行コマンドで.datなどのファイルのデータを計算したりファイル作ったり

.datファイルなどにあるデータの合計や平均値、そのデータを用いた計算をわざわざプログラムファイルを作らずとも、ターミナル上のコマンドでやる方法。個人的学習メモ。awkを使った1行プログラムでdatファイルを処理する。

 1.連続した数字を並べたdatファイルを作る
 awk 'BEGIN{for(i=1; i<=20; i++) print i}' > test.dat
と打つと 1から20までならんだtest.datファイルが作られる
1
2
3
.
.
19
20
これの平均を求める
awk '{sum += $1}END{print sum/NR ;}' test.dat
10.5
とでる。test.datの最後の行にave10.5を追加するには
awk '{sum += $1}END{print "ave""\t" sum/NR ;}' test.dat >> test.dat
と書く。>で上書き保存、>>で後ろに追加。"\t"でタブ。NRはその時点で読み込んだ行数。この行数は#でコメントアウトした行も含まれる。ENDで最後読み終わったあとの処理の意味。BEGINはファイル読み始める前に処理の意味。

2. 1行ごとに処理(計算)して出力
例えば
 awk 'BEGIN{for(i=1; i<=20; i++) print i*3}' > test2.dat
した
3
6
9
.
.
57
60
というtest2.datファイルを作ってtest2.datをtest.datでそれぞれの行を割りたい時。 pasteコマンドを使ってくっつけて|で受け渡してawkで処理して出力。
paste test.dat test2.dat | awk 'BEGIN{for(i=0; i<=20; i++) NR>i}{print $2/$1;}' > test3.dat
とすると
3
3
3
.
.
3
3
というtest3.datができる。ミソはBEGIN{for(i=0; i<=20; i++) NR>i}部分と思われる。for文で1つずつiを増やしていって{}に入らない条件部分でiより大きいNRの行数を見て{print $2/$1;}を処理。forのループでまた1つ行がずれる。(という理解。たぶん)

プログラミング雑魚なので今日やったことをとりあえずメモしておく。printで;つけてなくて出力できなくて30分以上悩んでた雑魚です。これ覚えておけば、解析でのdatファイルの扱いはなんとかなるはず。

0 件のコメント:

コメントを投稿