AWKの制御構造

AWKにも、ifによる条件分岐やwhile、forによる繰り返しなどの制御構造が あります。

    if (condition) statement [ else statement ]
    while (condition) statement
    do statement while (condition)
    for (expr1; expr2; expr3) statement

sin.awkの例を見れば分るように、条件式などの書き方も Cと同 じです。

    #!/usr/local/bin/gawk -f
    # sin.awk:
    BEGIN {
        for (i = 0; i <= 100; i++)
            printf("%1.6f\n", sin(i*3.1415/100));
    }

大小比較には<><=>===!=、などが使えますし、&&||、! 、も Cの論理積、 論理和、否定と同じです。

次のスクリプトnf.awkは、各レコード(各行)にちょうど6個のフィー ルドがあると期待しているとき、そのチェックを行うものです。

    #!/usr/local/bin/gawk -f
    # nf.awk: 各行のレコードに丁度6個のデータがあるか?
    {
        if (NF > 6) {
            print NR "行目、データが多過ぎ(" NF "個:)", $0;
        } else if (NF < 6) {
            print NR "行目、データが不足(" NF "個:)", $0;
        } else {
            print NR "行目、OK";  # この表示は余分かな。
        }
    }

Cと違うのは条件式のところに文字列と正規表現の比較が使えることです。 次の例reg.awkのようにチルダ ~ の左側に比較対象の文字 列を、右側に正規表現を書きます。

    #!/usr/local/bin/gawk -f
    # reg.awk: 文字列と正規表現の比較
    BEGIN {
        FS = ",";
    }

    {
        if ($0 ~ /96\//)            # 正規表現が文字列にマッチしたら真。
            print $1, $3;
    }

これは次のスクリプトreg2.awkと同じ出力になります。

    #!/usr/local/bin/gawk -f
    # reg2.awk: 文字列と正規表現の比較(2)
    BEGIN {
        FS = ",";
    }

    /96\/ {
        print $1, $3;
    }

また複数の式を { と } で囲ってブロックにして使うことも Cと同じです。 次の例は、九九を計算するスクリプトkuku.awkです。

    #!/usr/local/bin/gawk -f
    # kuku.awk: 九九の表を作る
    BEGIN {
        for (i = 0; i < 10; i++) {
            for (j = 0; j < 10; j++)
                printf("%3d", i * j);
            printf("\n");
        }
    }

実行結果はこんな具合です。

    % ./kuku.awk
      0  0  0  0  0  0  0  0  0  0
      0  1  2  3  4  5  6  7  8  9
      0  2  4  6  8 10 12 14 16 18
      0  3  6  9 12 15 18 21 24 27
      0  4  8 12 16 20 24 28 32 36
      0  5 10 15 20 25 30 35 40 45
      0  6 12 18 24 30 36 42 48 54
      0  7 14 21 28 35 42 49 56 63
      0  8 16 24 32 40 48 56 64 72
      0  9 18 27 36 45 54 63 72 81
    %

Cより全然楽でしょう?

OGURISU Osamu
2004-01-15