2011年 8月 1日 掲載
「AWK なんて化石だ」
Perl を使っていたころはそう思っていた. が,データを解析する分には,AWK で十分どころか, Perl なんかを使うよりずっと楽だということがわかり, 今では毎日 AWK のお世話になっている. そんな AWK でいかに処理が簡単に書けるかを,この連載では紹介していこうと思う.
このような趣旨で書いていくので,掲載するスクリプトは簡単なものばかりになる. あらかじめご承知おき願いたい.
今回は,超基本的な統計量を求めるスクリプトを紹介する.
まずは,サンプルデータの用意である. もちろん AWK で作る.
$ awk 'BEGIN{for(i = 0; i < 100; i++) print rand()}' > data.txt
これで,100個の乱数列が書き込まれたファイル data.txt ができたはずである.
$ wc -l data.txt 100 data.txt $ head data.txt 7.82637e-06 0.131538 0.755605 0.45865 0.532767 0.218959 0.0470446 0.678865 0.679296 0.934693
今回は,このデータを解析していく.
まずは,データの個数をチェックするスクリプト count.awk.
END{ print NR }
これだけである.実際に使ってみよう.
$ awk -f count.awk data.txt 100
ちゃんとデータの個数が数えられている.
次は,データの合計を出力するスクリプト sum.awk である.
{ sum += $1 } END{ print sum }
data.txt の合計は,
$ awk -f sum.awk data.txt 51.8425
となる.
データ数と和がわかれば,平均値を計算できる. 平均値を計算するスクリプト average.awk は,
{ sum += $1 } END{ print sum / NR }
と書けば,だいたいの場合は OK だが, 空のデータファイルを読み込んだとき 0除算エラーになるので,
{ sum += $1 } END{ if(NR == 0) exit print sum / NR }
と書いておく. 実行例は以下のとおり.
$ awk -f average.awk data.txt 0.518425 $ awk 'BEGIN{}' > empty.txt $ awk -f count.awk empty.txt 0 $ awk -f average.awk empty.txt $
空のファイル empty.txt を読ませても平気である.
sum.awk も,データが空のときは何もしないように書きなおしておこう.
{ sum += $1 } END{ if(NR == 0) exit print sum }
データの最大値,最小値を求めるスクリプトも書いてみる.
最大値を求める max.awk は,
NR == 1{ max = $1 } { if($1 > max) max = $1 } END{ if(NR == 0) exit print max }
最小値を求める min.awk は,
NR == 1{ min = $1 } { if($1 < min) min = $1 } END{ if(NR == 0) exit print min }
となる.
以下に,実行例を示す.
$ awk -f max.awk data.txt 0.999458 $ awk -f min.awk data.txt 7.82637e-06
AWKスクリプトは,1行目に「#!/usr/bin/awk -f」と書いて, 実行可にし,パスを通しておけば,コマンドのように使えて便利である. 1行目に「#!/usr/bin/awk -f」を追加するのも AWK で簡単にできる.
$ awk 'NR == 1 && !/^#!/{print "#!/usr/bin/awk -f"}{print $0}' count.awk #!/usr/bin/awk -f END{ print NR }
すでに「#!〜」がある場合は追加しないように書いておいた. こうしておけば,追加済みのスクリプトと未追加のスクリプトが混在していても,まとめて処理ができる.
今回の AWKスクリプト:
次回につづく.
[ KDO ホームにもどる ]
(C) 2011 KDO