AWK 基礎知識(その1)

最初の AWK スクリプトはいかがでしたでしょうか?
ここからしばらくは、AWK スクリプトの書き方の基本を詳細に説明いたします。

「最初のスクリプト」は以下のとおりでした。

BEGIN {
  print "Hello World!!";
}
このスクリプトに関連する意味を以下に説明します。

AWK の基本動作

AWK は、元々テキストを整形出力する「sed」やテキスト検索の「grep」などの UNIX コマンドの不便さを解消するために生まれました。(「プログラミング言語AWK」に記載されています。)私も、リダイレクトやパイプなどの機能とこれらの UNIX コマンドを組み合わせてテキスト処理していた時代がありました。それなりに便利に処理していたのです。AWK を知ってからは処理可能な範囲が広がり、とても楽にテキスト処理が出来るようになりました。

その AWK は以下のような順序で処理されます。
  1. gawk は、先ず「-f」オプションで指定される AWK スクリプトファイルを読み込む。
  2. スクリプトに「BEGIN」ブロックがあればそれを実行する。
  3. パターンがあればそれを評価し、真であればそれに続くアクションを実行する。
  4. このとき、指定されたファイルからデータを 1 行ずつ読み込みながら同じアクションが適用される。
  5. データファイルが全て読み出されたらパターン・アクションは終了する。
  6. 「END」ブロックがあればそれが実行される。
スクリプトでは以下のような記述になります。なお、{ } で囲まれた部分はブロックと呼び、この部分にアクションを記述します。アクションはさまざまな命令(以下「文」と呼ぶ)を組み合わせたプログラムです。パターン・アクションは複数記述できますが、BEGIN と END は複数記述できません。
BEGIN { アクション(文の並び)}
パターン { アクション(文の並び)}
END { アクション(文の並び)}
以上が標準的な AWK の実行順序です。
私は、C 言語と同じようにプログラムできるように「BEGIN」ブロックだけを記述します。これがポイントです。深野流なのです。この理由は後ほど明らかになります。

「BEGIN」について

「BEGIN」は、通常のプログラミング言語には無い概念です。これは AWK のメインの機能である「パターン」の一種で、AWK スクリプトで最初に 1 回だけ実行されます。
深野流では「BEGIN」ブロックのみをスクリプトととして書き、パターンや END ブロックは使いません。AWK の特徴的な便利さを捨ててしまうのです。C 言語のメイン関数と同じように使うことになります。
AWK では・・・
BEGIN {
  …(文の並び)…
}
・・・と記述しますが、これは C 言語の・・・
void main(void) {
  …(文の並び)…
}
・・・と同じ形になります。これだけのことで C 言語と同じようにプログラムを記述できるという安心感がありました。
AWK の文は C 言語と酷似しています。AWK の「ファイルを読み込みパターンで処理する」という便利な機能は捨て去ってしまったのです。C 言語に慣れていたこともありますが、私の経験では明示的にファイルを読み込ませる方が良いケースが多かったのです。

ところで、AWK では C と同様に文の並び(順序など)さえしっかりとしていれば、インデントをつけてスクリプト構造を見やすくしたり、適当な位置で改行するなどフリー・フォーマットで良いのです。しかし、以下のようなことは許されていません。
BEGIN
{
  …(文の並び)…
}
2 行目のブロックが、パターン指定無しのアクションと解釈されてしまいます。必ず「BEGIN」の行にブロックを書いてください。ですから、以下のような場合は許されます。
BEGIN {…(文の並び)…}
このことだけに注意すれば、C 言語と同じようにスクリプトを記述できます。

「AWK の基本動作」の説明はこれでおしまい。。。
<-->

戻る