概要

AWKはスクリプト言語の一種です。使い込めば複雑な処理も可能ですが、お手軽に使用できるのが何よりの長所で、コンパイルが不要なので書き捨てスクリプトとしてよく用いられるようです。Cなどでは大袈裟な処理は大抵AWKや perl,ruby、シェルスクリプトで処理するのが一般的ですが、例えば数値計算などで扱うカンマ・TAB・スペース区切りのデータファイルはAWKだと楽に処理できると私は感じています。

有用link

使い方

こちらも私はGNUのAWK(gawk)を用いてい ます。対象となるデータは以下の様にファイルに記述されているとします。

dataA  10  500
dataB  20  600
dataC  30  700
....

この時

gawk '{print $3;}' hoge

とすればファイルhogeの3列目のデータ(500,600,700,...)がズラズラと出力されます。コマンド内のドルマークの前の数字は列の番号を表し、それを出力する様命令しているわけです。この空白で区切られたデータをフィールドと呼び、 複数のフィールドから成る行全体をレコードと呼びます。レコードは"$0"と表されますが、printの引数を省略すればレコードが出力されるようになってい ます。このデータを処理するには次の様に記述します。

gawk '{print 100*$3;}' hoge

これで、3つ目のフィールドに100を乗じたものが出力されます。こういった演算には三角関数などの初等関数が使用できます。もう少し凝ったことをするには変数を用います。

gawk 'BEGIN {sum=0;} {sum+=$3;} END {print sum;}'

これで3つ目のフィールドの合計が出力されます。BEGINとENDは前処理と後処理のコマンドを記述します。ここでは、まず変数sumを宣言し(BEGIN)、そしてデータを加算して、最後にその内容を出力(END)するわけです。BEGINとENDの 文字列は一方を省略することができます。さて変数として、NRとNFというものがあらかじめ使用できます。前者は現在のレコード番号を指し、後者はレコード中のフィールドの数です。つまり次の様にすれば、データと共にその行番号を得られます。

gawk '{print NR, $3;}' hoge

NRに何か加算や乗算をすれば規則的なデータ列が得られるわけです(for文でもできますが)。またこれを利用して、処理する行を指定することも可能です。

gawk 'NR<=3 {print $3;}' hoge

コマンドの手前の部分が条件部です。3行目までの3フィールド目を出力せよ、という意味になります。この"NR<=3"を"/foo/"などとすれば、「3行目まで」という条件は「fooを含む行」と変わります。この他にFSという変数もあり、これは区切り文字を表します。

gawk 'BEGIN {FS=",";} {print $3;}' hoge

とすれば、フィールド間はカンマで区切られているとみなされます。またレコードを区切る変数としてRSというのもあります。デフォルトでは改行ですが、これを変えれば

------
hogehoge
------
fugafuga
------

といった区切りのテキストを処理する事も容易です。これらだけでもそこそこのことはできると思いますが、AWKは書式付き出力関数printfやforループなども持ち、さらに複雑なことをさせることも可能です。


Last-modified: Mon, 21 Feb 2005 15:40:51 JST