行単位で実行される処理よりも前に,または後に実行したい事もあるかと思います.そんな時に便利なのがBEGINとENDです. BEGINは通常のpattern{action}よりも前に実行され,ENDはpattern{action}よりも後に実行されます.それを利用してBEGINは値の初期化など,ENDは全体を通して得られる結果(平均など)を表示する事によく使われるようです.
例えばBEGINであればデータが1行に一個ずつ入っているファイルを,行番号とデータのテーブルを作成したいと思ったとき,
$awk 'BEGIN{print "x y"}{print NR, $1}' sindata
のようにする事と思います.xとyの表示は最初に1度でいいので BEGINを使用します.ちなみにprintの後に変数をコンマで区切って羅列すると区切り文字を挟んで表示してくれます.出力時の区切り文字はOFSで変更できます.区切り文字の変更も次のようにBEGINで設定します.
$awk 'BEGIN{print "x y"; OFS="#"}{print NR, $1}' sindata
これで区切り文字が#に変更されました.
最終的な結果を出力するようなときにはENDを使います.これはプログラムが終了する直前に実行される部分です.
$ awk '{sum += $1}END{print sum/NR}' sindata
これはsindataの全部の行の値の平均を出力していますが,平均を算出するには全てのデータを知った後でないと求められません.そのため全ての行に対するactionを終え,終了する間際に算出する訳です.
またBEGINとEND,各行のpatternとaction全てを同時に指定もできます.
$ awk 'BEGIN{print "average"} NR<5 {sum += $1}END{print sum/NR}' sindata2