テキストを扱う awk というコマンドがあります。
このコマンド、かなり便利なのですが、 できることが多過ぎるので覚えるのは結構大変だったりします。 「基本的な使い方はわかるけど・・・」という人も多いのではないでしょうか。 自分へのメモの意味も含めて機能を紹介したいと思います。
次のテキストを処理します。( test.txt )
1 2 3 4 5 6 7 8 9 10 11 12
まず基本的な使い方です。
$ cat test.txt | awk '{print $2}'
2
5
8
11
awk の書式で {} の前にはパターンを書くことができます。
{} の前に何も書かないのは、全ての行にマッチ(全ての行に対して処理をする)という指定になります。 (これについてはまた別の機会に詳しく書きたいと思います)
今回は、BEGIN と END という特殊な指定を使いますが、BEGIN は「最初の行の前」にマッチする指定で END は「最後の行の後」にマッチする指定です。これを使ってヘッダーやフッターを出力します。
次のような指定ができます。
$ cat test.txt | \ > awk 'BEGIN {print "-- header --"} END {print "-- footer --"}' -- header -- -- footer --
BEGIN と END の指定しかないので、ヘッダーとフッターのみが出力されました。
プログラムの部分が長くなるので、別ファイル( prog.txt )に指定して 引数で読み込むようにします。
次のような指定をしてみます。
BEGIN { print " f1 | f2 | f3 "; print "----+----+----"; } { printf("%4d|%4d|%4d\n", $1, $2, $3); }
BEGIN (前半)と 全ての行にマッチする指定(後半)をしました。
次のような結果になります。
$ cat test.txt | awk -f prog.txt f1 | f2 | f3 ----+----+---- 1| 2| 3 4| 5| 6 7| 8| 9 10| 11| 12
ヘッダーと本体が出力されました。
次はフッターに合計行を出したいと思います。
awk は計算もできます。
BEGIN { print " f1 | f2 | f3 "; print "----+----+----"; f1=0; f2=0; f3=0; } { printf("%4d|%4d|%4d\n", $1, $2, $3); f1=f1+$1; f2=f2+$2; f3=f3+$3; } END { print "----+----+----"; printf("%4d|%4d|%4d\n", f1, f2, f3); }
初期化処理は BEGIN に書くことができます。
次のような結果になります。
$ cat test.txt | awk -f prog.txt
f1 | f2 | f3
----+----+----
1| 2| 3
4| 5| 6
7| 8| 9
10| 11| 12
----+----+----
22| 26| 30
合計行を出力することができました。
ちょっとしたときにサッと書けるとカッコ良いですね。