Awkことはじめ

written by がいすと

4 短いプログラム

少しの間、短いプログラムを紹介しましょう。さっきの例で使った表をまた使います。ただ、全ての情報を書くには紙面がいくらあっても足りませんので、ここでは詳しい説明を省きます。AwkはC言語に似た文法なので、Cを少し知っていれば読めると思います。そうでない人も、いろんなことが簡単に書けるんだな、と感じてもらえればいいかと思います。

1) 一部の列を抜き出したい場合

「第2項が1000以上の列だけを表示する」という場合を考えてみましょう。Awkでは、{}の前に条件を書くだけで、ある条件に合う列だけを処理することができます。条件は、やはりCのように書くことができます。


$2 >= 1000{print $1,$2,$3}

Awkでは文の全体が$0という変数に入れられています。従って、


$2 >= 1000{print $0}

と書けます。実は、条件式だけ書くと、{print $0} が省かれているものとして処理されます。つまり、


$2 >= 1000

が最も簡単なプログラムとなります。できる限り書くのを省略できるような設計になっていることがおわかりになると思います。

結果は以下のようになります。


B 1000 2
D 1200 30

2) ファイルを読み込む前に何か処理をする

出力の最初に「結果」と表示するプログラムをを作ってみましょう。BEGIN{読み込む前の処理}と書くと、ファイルを読み込む前に処理ができます。


BEGIN{print "結果"}
{print $1,$2*$3}

結果は以下のようになります。


結果:
A   800
B  2000
C  4000
D 36000

逆に、読み込んだ後に処理をしたい場合には、END{終了後の処理}とします。

3) 少し応用した例

第2項の平均を求め、出力する場合を考えてみましょう。このためには、

  • 全ての第2項の和を求める
  • この和を、列の数で割る

という手順を踏む必要があります。

和を求める処理は以下のようになります:


{sum = sum + $2}

これは、「変数sumの値に今の行の第2項の値を加えろ」という意味になります。全ての変数は、必ず0で初期化されているので、改めて初期化する必要はありません。

次に、この和を、列の数で割ります。この処理は最後にやりますから、前の項で示したEND{終了後の処理}がつかえます。また、列の数は自動的にNRという変数に格納されています。ですから、平均を求めるには、変数sumを使って、sum/NRと書くことができます。


{sum = sum + $2}
END{print "平均 = ", sum / NR}

結果は以下のようになりますね。


平均 = 950