awkを使う

awk は「1行=1レコード」とみなせるようなテキスト・データベースの処理に 便利な言語です。C のようなコンパイラではなく、インタプリタなので、 いろいろなプログラム(スクリプト)簡単に試すことができます。

準備

まず、下記のようなファイル sample.dat を用意して下さい。
taro 90.3
jiro 62.8
saburo 21.1
shiro 28.0
goro 40.5
kenji 37.9
takashi 55.1
masao 71.3
このファイルで、各行を「レコード」、空白で区切られた1つ1つの要素を 「フィールド」と呼びます。

あるフィールドだけ抜き出す

awkのスクリプトファイルを作ります。 ファイル名は sample1.awk にしてください。
{print $2}
ファイルを作ったら、次のように実行してみましょう。
awk -f sample.awk < sample.dat
こんな結果が出ると思います。
90.3
62.8
21.1
28.0
40.5
37.9
55.1
71.3
では、こんどはスクリプトをこう直してください。
{print $2 " " $1}
こうなりましたか?
90.3 taro
62.8 jiro
21.1 saburo
28.0 shiro
40.5 goro
37.9 kenji
55.1 takashi
71.3 masao

printf()も使えます

スクリプトをこう直してみましょう。
{ printf("%5.2f %s\n", $2, $1) }
結果はこうです。
90.30 taro
62.80 jiro
21.10 saburo
28.00 shiro
40.50 goro
37.90 kenji
55.10 takashi
71.30 masao

パターンとアクションを活用する

次のスクリプトです。
BEGIN { print "30点以下の人は追試です" }
$2 < 30 { printf("%5.1f %s 追試!!\n", $2, $1) }
$2 >= 30 { printf("%5.1f %s\n", $2, $1) }
END { print "以上。" }
結果はこうです。
30点以下の人は追試です
 90.3 taro
 62.8 jiro
 21.1 saburo 追試!!
 28.0 shiro 追試!!
 40.5 goro
 37.9 kenji
 55.1 takashi
 71.3 masao
以上。

計算もできます

次は、成績の平均点を求めてみましょう。簡単です。
BEGIN {total = 0}
{total += $2}
END {print total / NR}
結果はこうです。
50.875
ね、便利でしょ? なんでも C 言語でやろうとせずに適材適所を心がけましょう。

UNIX 上の便利なインタプリタとしては awk の他にも csh, perl, tcl/tk など があり、それぞれ目的も使い方も異なります。 機会があればいろいろ勉強してみてください。


May.21,1996 T.NISHIMOTO