26.4.1 awk とは?

awk はデータ処理のためのプログラミング言語で,特にテキスト形式で保存された表データを処理するのに適しています.複雑なプログラムを書くための言語ではありませんが,表データの整形や集計などをシェルの上から行うことができるので,簡単な処理なら他のプログラミング言語よりずっと簡単にこなすことができます.

早速使ってみましょう.説明のため,次のサンプルファイルを使います.

201108tokyo.txt

1008.3	1012.5	0.0	0.0	0.0	24.5	27.3	22.1	69	56	2.5	5.0	8.9	0.3
1010.7	1014.8	0.0	0.0	0.0	25.5	29.1	22.0	69	53	2.3	5.1	8.0	1.6
1009.8	1014.0	15.5	14.5	11.5	26.1	29.3	24.4	76	61	2.0	5.2	8.7	0.9
...

このデータは,東京における2011年8月の平均現地気圧,平均海面気圧,合計降水量,1 時間降水量の最大値,10 分間降水量の最大値,平均気温,最高気温,最低気温,平均湿度,最小湿度,平均風速,最大風速,最大瞬間風速,日照時間を 1 行にまとめ,1 日から 31 日まで順番に並べたものです.気象庁のウェブサイトにある external気象統計情報 から引用しました.

まずはターミナルに次のように打ち込んでください.

awk "{ print }" 201108tokyo.txtreturn2
1008.3    1012.5    0.0    0.0    0.0    24.5    27.3    22.1    69    56    2.5    5.0    8.9    0.3 1010.7    1014.8    0.0    0.0    0.0    25.5    29.1    22.0    69    53    2.3    5.1    8.0    1.6 1009.8    1014.0    15.5    14.5    11.5    26.1    29.3    24.4    76    61    2.0    5.2    8.7    0.9 ...

awk もまた grep や sed と同じように,テキストを 1 行ずつ読み込んで出力します.上の例に出てくる print は,1 行をまるごと出力するというコマンドです.よって 201108tokyo.txt の中身がそのまま出てきます.

awk が grep や sed と決定的に異なるのは,読み込んだ行のデータを列ごとに分割するという点です.awk は 1 つの行を読み込むと,一番左の列から順に $1, $2, … という記号で列データを扱います.次の例を見てください.

awk "{ print $1 }" 201108tokyo.txtreturn2
1008.3 1010.7 1009.8 ...

$1 は 1 列目のデータを表します.print コマンドで $1 だけ出力させているので,各列の 1 行目のみが得られるわけです.また print コマンドで出力させるものはカンマで区切って並べることができます.たとえば次のようにすると,1 列目と 2 列目だけを取り出すことができます.

awk "{ print $1, $2 }" 201108tokyo.txtreturn2
1008.3 1012.5 1010.7 1014.8 1009.8 1014.0 ...

さらに print の中を $2, $1 の順にすれば,1 行目と 2 行目を並び替えた出力になります.

awk "{ print $1, $2 }" 201108tokyo.txtreturn2
1012.5 1008.3 1014.8 1010.7 1040.0 1009.8 ...

表データの列を並べ替える操作は表計算ソフトでも簡単にできますが,しかしその操作は面倒です.それに比べて awk を使えば,シェルで 1 行コマンドを打つだけで瞬時に行が入れ替わります.このように awk を適切に使うことで,色々な作業を効率よく進めることができます.

最後に,201108tokyo.txt のデータを抜粋しておきましょう.元々のファイルはデータが多すぎるので,この中から平均現地気圧,合計降水量,1 時間降水量の最大,最高気温,最低気温,湿度だけを抜粋することにしましょう.これらのデータは 201108tokyo.txt において,それぞれ 1行目, 3 行目, 4 行目, 7 行目, 8 行目, 9 行目に対応しています.そこで次のようにして,抜粋したデータを 201108tokyo_02.txt に保存します.コマンドの最後の > 以降はリダイレクション(hwb15.5 パイプとリダイレクション)です.

awk "{ print $1, $2 }" 201108tokyo.txt > 201108tokyo_02.txtreturn2
1008.3 0.0 0.0 27.3 22.1 69 1010.7 0.0 0.0 29.1 22.0 69 1009.8 15.5 14.5 29.3 24.4 76 ...

これで抜粋データを作ることができました.次の節からは,今作った抜粋データを元に awk の使い方を詳しく見ていきます.