2010年4月19日月曜日

AWKプログラムの基本パターン - AWK

AWKのパターンと制御文
AWKプログラムを書く
○Gawk on Windows ○Gawk ○mawk32 ○Mawk ○awk
AWKプログラムは、次の4つの基本パターンを並べて作ります。
ですので、AWKプログラムを読む時は、この4つの基本パターンを意識しながら読むと、イメージが掴み易いです。

(1) ファイルを一行読み込む毎に実行します。実行する条件を書く事も出来ます。
(2) BEGIN = ファイルを読み込む前に実行します
(3) END = プログラムの最後に1度だけ呼び出されます
(4) function = 関数です = 呼ばれた時に実行します

o function は、部品を作る時に使います。
    + 用語としてはパターンには入りませんが、書き方はパターンと同じです。
o AWKは、複数の入力ファイルをまとめて読み込む事が出来ます。
o BEGIN パターンと END パターンは、まとめて読み込むにも、AWKプログラムから1回だけ呼ばれます。


**** 基本パターン
** (1) ファイルを一行読み込む毎に実行します
--------
{
  print "こんにちは。" NR "行さん。"; # NRはこれまでの読み込み行数です。
}

# 条件を書いて、読み込む行を選択する事も出来ます。
$1 == "ミク" {
  print "こんにちは。ミクさん。";
}
--------

o 条件の書き方については「パターンの書式と使い方
o 行末のセミコロンは、C言語の書き方に合わせました。無くても動きます。


** (2) BEGIN = ファイルを読み込む前に実行します
--------
BEGIN {
  print "ファイルを読まずに終了します。";
  exit;
}
--------

o 出てくる単語の意味は、「BEGIN = 最初に実行する
    + 「print = ファイルなどに書き出す
    + 「exit = 終了する

** (3) END = プログラムの最後に1度だけ呼び出されます。
o ファイルを最後まで読んだ後に実行します。ファイルを複数指定した時は、全部読み込んだ後に実行します。
--------
END {
  print "全部で" NR "行ありました。";
}
--------

o 出てくる単語の意味は、「END = 最後に実行する


** (4) function = 関数です = 呼ばれた時に実行します
--------
function f_get_price(v1) {
  return (v1 * 100);
}
{
  v_apple = $1;
  print "林檎。" v_apple "個の価格は、" f_get_price(v_apple) "円です。";
}
--------

o 出てくる単語の意味は、「function = 関数を作る
    + 「return = 関数の呼び出し元に戻る


**** メモ
o 1行の処理の途中で次の行に進みたい時は next;
o 「END」以外の場所で exit文を書く場合
  + 「END」を書くと、プログラム終了時に必ず通ります。
  + 「END」の処理を行いたくない時は、「END」の最初で判定して、もう一度exitします。


**** 確認した処理系
o Gawk on Windows 3.1.7
o Gawk for Windows 3.1.6
o mawk MBCS (32bit版) 1.3.3
o Mawk for Windows 1.3.3
o original = the one true awk(updated May 1, 2007)


==
関連ページ:
    ▼AWKのパターンと制御文▼ABC順
    ▼AWKプログラムを書く▼ABC順
    ▼AWK
    ▼制作メモ
    > AWKの関数名と変数名を区別する方法
    ローカル変数を使う
    AWKプログラム実行時に変数を設定する
(2011年2月2日変更。冒頭の説明文の見直し)
(2010年9月27日追加。各例について機能説明ページへのリンク)