awk の基本的な使い方

26.4.2. awk の基本的な使い方

awk の基本的な使い方を例で理解しましょう。前節 26.4.1. awk とは? で作成したファイル 201108tokyo_02.txt を使います。

パターンとアクションの書き方 #

前節で書いた awk のプログラムをもう一度見てみましょう。

awk “{ print $1 }” 201108tokyo.txt

このように awk では中括弧 {} で括って、中に動作を書きます。中括弧の中に書かれるものをアクションと言います。単にアクションだけを書くと全ての行でアクションが実行されますが、アクションの前に条件を書くことで、特定の行だけでアクションを実行させることができます。この条件をパターンと呼びます。次の例を見てください。

awk " $4 >=30.0 { print NR, $0 }" 201108tokyo_02.txt

4 1009.1 4.5 2.5 31.1 24.3 73 5 1008.2 4.5 7.0 31.2 25.1 74 6 1007.3 0.0 0.0 32.3 26.0 70 …

$4 は各行の 4 列目を表します。アクションの前に $4>=30.0 と書いたことで、4 列目の数値が 30.0 以上の場合にのみ print NR, $0 が実行されるようになります。ここに出てきた NR と $0 はそれぞれ「これまでに読み込んだ行の数」と「読み込んだ行の全体」を表します。$4 は最高気温のデータでしたから、上のスクリプトは真夏日のデータだけを抽出して表示させていることになります。

パターンには数値の比較以外にも文字列の比較など様々な方法があります。他の方法については追って紹介します。

特別なパターン #

awk では BEGIN と END という特別なパターンが用意されています。これらのパターンは、それぞれプログラムが実行された直後および終了する直前に実行されます。たとえば BEGIN パターンは次のように使います。

awk " BEGIN { print "day temp(h) temp(l)"} $4 >=30.0 { print NR, $4, $5 }" 201108tokyo_02.txt

day temp(h) temp(l) 4 31.1 24.3 5 31.2 25.1 6 32.3 26.0 …

BEGIN パターンの中に書いたアクション print “day temp(h) temp(l)” がプログラムの最初に実行され、列の見出しを出力することができました。ダブルクォーテーションの前にバックスラッシュがついて \” となっているのは、この外側で既に ” を 1 回使っているからです。BEGIN パターンは見出しを表示する以外にも、たとえばすぐ下で説明する変数を初期化するのに使ったりします。

END パターンは BEGIN パターンとは逆に、全ての行を読み終わった後に実行させるアクションを書くのに使います。たとえばデータを表示し終わった後に集計結果を表示させたい場合に有効です。END パターンの使用例は、変数の使い方と合わせて説明することにします。

変数の使用 #

awk プログラムでは変数を使うことができます。変数を使うことで、データの数値的な処理などを行うことができます。まず次の例を見てください。

awk " BEGIN { print "day temp(h) temp(l)"; d=0} $4 >=30.0 { print NR, $4, $5; d++; } END{ print d }" 201108tokyo_02.txt

day temp(h) temp(l) 4 31.1 24.3 5 31.2 25.1 … 31 30.4 21.6 21

BEGIN パターンのところに d=0, パターン $4>=30.0 のところに d=d+1 が、END パターンの中に print d が書かれています。こうすることで

  • プログラム実行時に変数 d の値を 0 にする (変数は 0 で初期化されるので、本当はこの部分は不要です)
  • $4>=30.0 である度に、d の値を 1 増やす
  • 全ての行を読み終わった後に、d の値を表示する

という動作になります。真夏日を見つけるたびに d が 1 増えるので、プログラムの最後で d の値は 8 月中の真夏日の日数になっています。それを END パターンを用いて表示させているわけです。

他にも変数を応用すれば、データの合計値や平均値を計算することもできます。ぜひやってみてください。

awk とは? awk の基本的な使い方 参考文献
このサイトは開発版の はいぱーワークブック です.