awk のスクリプトには:
BEGIN{アクション}
パターン 1 {アクション}
パターン 2 {アクション}
パターン 3 {アクション}
...
END{アクション}
exit 文は全ての処理を中止し (つまり, 入力データを全て読み終えて処理をしたかのように) 最後の END 部を実行する. END 部がなければ, そのまま実行は終了する.
次のスクリプトは, ファイルの中で, “word” という綴りの出現する行数をカウントして, 50 回を超えたら, ファイル名を出力して, 処理を終了する:
/word/{
times++ # 入力行に word という綴りが出現するたびに times はインクリメント
if(times > 50){
print FILENAME # FILENAME は組み込み変数で入力ファイルをフルパスで表す
exit
}
}
next 文は exit 文より少し複雑である. next 文は, アクションの中に置かれるが, 残りの処理を中断し, さらに, 残りのパターンの照合も中断して, ただちに次の入力行の処理を新しく始める:
/pattern 1/{
action 1
next # 以下のパターンマッチングを省略して, 次の入力行の処理へ
}
/pattern 2/{
action 2
next # 以下のパターンマッチングを省略して, 次の入力行の処理へ
}
/pattern 3/{
action 1
next # 以下のパターンマッチングを省略して, 次の入力行の処理へ
}
...
/pattern N/{
action N
next # 以下のパターンマッチングを省略して, 次の入力行の処理へ
}
data15_1.txt
東京, 大阪, 名古屋
東京, 大阪, 名古屋
東京, 大阪, 名古屋
東京, 大阪, 名古屋
scpt15_1.awk
#!/usr/local/bin/gawk -f
# scpt15_1.awk
/東京/{
print "東京出身だね"
}
/大阪/{
print "大阪出身やね"
}
/名古屋/{
print "名古屋出身だがや"
}
scpt15_1.awk の実行結果は:
[cactus:~/code_awk/tuts]% ./scpt15_1.awk data15_1.txt
東京出身だね
大阪出身やね
名古屋出身だがや
東京出身だね
大阪出身やね
名古屋出身だがや
東京出身だね
大阪出身やね
名古屋出身だがや
東京出身だね
大阪出身やね
名古屋出身だがや
scpt15_2.awk
#!/usr/local/bin/gawk -f
# scpt15_2.awk
/東京/{
print "東京出身だね"
next
}
/大阪/{
print "大阪出身やね"
next
}
/名古屋/{
print "名古屋出身だがや"
next
}
scpt15_2.awk の実行結果は:
[cactus:~/code_awk/tuts]% ./scpt15_2.awk data15_1.txt
東京出身だね
東京出身だね
東京出身だね
東京出身だね
scpt15_3.awk
#!/usr/local/bin/gawk -f
# scpt15_3.awk
/東京/{
print "東京出身だね"
if(getline == 0) # ファイルの終わりの場合の処理
exit
}
/大阪/{
print "大阪出身やね"
}
/名古屋/{
print "名古屋出身だがや"
}
scpt15_3.awk の実行結果は:
[cactus:~/code_awk/tuts]% ./scpt15_3.awk data15_1.txt
東京出身だね
大阪出身やね
名古屋出身だがや
東京出身だね
大阪出身やね
名古屋出身だがや
東京人が 2 回, 大阪人, 名古屋人がそれぞれ 2 回ずつ登場する. このスクリプトではファイルの 1 行目については /東京/ のパターンマッチに合格して, 最初のアクションが実行される. しかし, そのアクションの中で getline を実行し, ファイルの 2 行目を読み込む. この 2 行目に関しては /東京/ のパターンマッチングは行われない. 次の /大阪/ のパターンマッチング と /名古屋/ のパターンマッチングが行われ, それぞれ print 文が実行される. そのあと 3 行目が新たに読み込まれるが, ファイルの 1 行目の時と同様に, /東京/ のパターンマッチングに合格し, print 文が実行されるが, そのあとの getline で 4 行目が読みこまれる. これに対しては, /大阪/ と /名古屋/ のパターンマッチングが行われる. 5 行目はないのでこれで終了する.