awk のスクリプトの構造は:
BEGIN{アクション}
パターン 1 {アクション}
パターン 2 {アクション}
...
END{アクション}
の形になっている.
BEGIN パターンで記述されるアクションは, 一回だけ, 一切の入力に先だって実行される. また END パターンの部分は, 全ての入力が終わった後に, 一度だけ実行される. 中間のパターン {アクション} 部分はいくつでも書くことができ, 上から順番に, 入力行が指定されたパターンに合致するかどうかを調べて, 合致すればそのアクション部分が実行される. これを実際に確かめるために次のようなスクリプトを実行してみる.
data10_1.txt
1 行目の文字列
2 行目の文字列
3 行目の文字列
4 行目の文字列
scpt10_1.awk
#!/usr/local/bin/gawk -f
# scpt10_1.awk
BEGIN{
print "BEGIN 部を実行中"
}
{
print "第 1 のアクション " $0
}
{
print "第 2 のアクション " $0
}
{
print "第 3 のアクション " $0
}
END{
print "END 部を実行中"
}
scpt10_1.awk の実行結果は:
[cactus:~/code_awk/tuts]% ./scpt10_1.awk data10_1.txt
BEGIN 部を実行中
第 1 のアクション 1 行目の文字列
第 2 のアクション 1 行目の文字列
第 3 のアクション 1 行目の文字列
第 1 のアクション 2 行目の文字列
第 2 のアクション 2 行目の文字列
第 3 のアクション 2 行目の文字列
第 1 のアクション 3 行目の文字列
第 2 のアクション 3 行目の文字列
第 3 のアクション 3 行目の文字列
第 1 のアクション 4 行目の文字列
第 2 のアクション 4 行目の文字列
第 3 のアクション 4 行目の文字列
END 部を実行中
上のスクリプトでは本処理の部分は全てパターンが省略されているので全て無条件に実行される. その結果各行が三回ずつ処理されているのがわかる.
上で見たのは, スクリプト全体の実行順序である. 上から下へ並べられた順番に実行され, さほど複雑ではない. しかし, 各アクションの内部では, スクリプトの書き方次第で, 複雑な処理を行わせることが可能になる.
ここからは, 何回か, 各アクションの内部でのスクリプトの実行順序とその制御を取り扱う.
入力行がパターンに合致するとアクションが実行される. アクション部分はひとつ以上の実行文からなる.
複数の実行文がある場合, 単純に並べると, 先頭から実行されていく. 次のスクリプトを, 同じく data10_1.txt に対して実行して, 確かめてください.
scpt10_2.awk
#!/usr/local/bin/gawk -f
# scpt10_2.awk
{
print "文 1 で出力: " $0
print "文 2 で出力: " $0
print "文 3 で出力: " $0
}
scpt10_2.awk の実行結果は:
[cactus:~/code_awk/tuts]% ./scpt10_2.awk data10_1.txt
文 1 で出力: 1 行目の文字列
文 2 で出力: 1 行目の文字列
文 3 で出力: 1 行目の文字列
文 1 で出力: 2 行目の文字列
文 2 で出力: 2 行目の文字列
文 3 で出力: 2 行目の文字列
文 1 で出力: 3 行目の文字列
文 2 で出力: 3 行目の文字列
文 3 で出力: 3 行目の文字列
文 1 で出力: 4 行目の文字列
文 2 で出力: 4 行目の文字列
文 3 で出力: 4 行目の文字列