3つ目の 欄が 15を 越えるような 行を 読み込む たびに、 それまでの emp の 値を ひとつ 増やして います。 数値 として 使用される awk の 変数は、 最初に 値 0 から 始まります。 したがって、 emp を 初期化する 必要は ありません。
$3 > 15 { emp = emp + 1 } END { print emp, "employees worked more than 15 hours." }
上の awk プログラムを m15.awk という名前で作成しておき、以下のように実行します。以下、同様に awk プログラムファイルの作成と実行を練習して下さい。
sw%99 awk -f m15.awk emp.dat3 employees worked more than 15 hours.
という プログラムは、 賃金の 合計を pay に 加算して いきますから、 最後に、 従業員の 数と 合計賃金、 平均賃金を 表示する ことに なります。 一つのアクション内に複数の命令(式)を書くときは ; (セミコロン)で 区切ります。上の print の例では必ずしも必要ではありませんが、 習慣として入れておいた方がよいでしょう。
{ pay = pay + $2 * $3 } END { print NR, "employees"; print "total pay is",pay; print "average pay is",pay/NR; }
$2 > max { max = $2; who = $1 } END { print "Highest hourly rate:", max, "for", who }
{ names = names $1 " " } END { print names }
{ last = $0 } END { print last }
BEGIN { print "*** Employee Statistics ***" } $3 > 15 { emp = emp + 1 } { pay = pay + $2 * $3 } $2 > max { max = $2; who = $1 } { names = names $1 " " } { last = $0 } END { print "Employee list:", names; print NR, "employees"; print emp, "employees worked more than 15 hours." ; print "total pay is",pay; print "average pay is",pay/NR; print "Highest hourly rate:", max, "for", who ; print "Who was the last:",last; }
システム固有のユーザ(root や lp など裏方の仕事をするようになっています) は /etc/passwd に定義されています。 このファイルでの 各項目は : で 区切られて いますから、
とすれば、 root さんの 本名が 出てきます。 ネットワーク情報システム NIS+ に登録されたユーザの場合は別のコマンドで ユーザ情報のリストを表示することができます。 (但し、 awk を 使わなくても、 finger コマンドを 使えば 本名や その他の 情報が 表示されます。)
sw99% awk -F: '$1 == "root" {print $5}' /etc/passwd![]()
以上のほかにも、 awk は 組み込み 関数や、 if-else文、 while文、 for文
などを 使った 複雑な 計算や プログラム制御を おこなう ことが できます。
これらの 詳細に ついては、 C言語を 学んだ 後で 参考書 「プログラミング言語AWK」
エイホ・ カーニハン・ ワインバーガー著・ 足立訳 (トッパン・ 3,400円)
を 読むことを 勧めます。
練習問題
awk を使った難しい例題もあります。