AWK

AWKは、プログラミング言語の一つ。テキストファイル、特に空白類やカンマなどで区切られたデータファイルの処理を念頭に置いた仕様となっているが、一般的なプログラミングに用いることも可能である。UNIX上で開発された。

1. 概要
-----

AWKは、ベル研究所におけるUNIX開発の過程で、sedやgrepのようなテキスト処理ツールに演算機能を持たせた拡張ツールとして1977年アルフレッド・エイホに開発された。そのため、UNIX上のユーティリティである sort の存在を前提としているアルフレッド・エイホ。

簡単なスクリプトを記述することで効率的にテキストファイルを処理することが目的であった。 当初はそれほど多くの機能は無かったが、普及するにつれ、さまざまな処理をAWKで実行したいと考えるユーザーが増え、その希望に応えて1985年アルフレッド・エイホに機能の拡張が行われた。その結果、汎用のプログラミング言語と比べても遜色が無いほどの機能を持つようになり、テキスト処理だけに留まらず、開発者も予想しなかったような大規模なプログラミングに使われるような例もあらわれた。一方、本来のテキスト処理用ツールとしても扱いやすく、現在でもCSV形式のファイルを簡易に処理する、などの目的で広く使用されている。

「AWK」という名称は、開発者であるアルフレッド・エイホ、ピーター・ワインバーガー、ブライアン・カーニハンの3人の苗字の頭文字を取って付けられたものであるが、AWKは「オーク」と読み、「エー・ダブリュー・ケー」と読んではならないと著者らはしている。 また、全て小文字でawkとした場合、Unix系OSないしPlan 9における、AWKのインタプリタ処理系プログラム自体を指してそうしていることがある。

2. AWKの文法
---------

2.1. 基本構成
---------

AWKのスクリプトは、パターンとアクションの組を並べた形になっている。 実行を開始すると、まずlang=awkパターンのアクションを実行する。 以降、入力を読み込んでは、レコード分離文字までを1レコードとし、ユニット分離文字に従ってフィールドに分割してから、レコードがパターンにマッチするかを調べ、パターンにマッチしたらそのパターンに対応するアクションを実行する。 一致するパターンが複数ある時は、該当するアクションが上から順に全て実行される。これを入力が尽きるまで繰り返す。入力が尽きたら、lang=awkパターンのアクションを実行し、終了する。すなわち、テキストストリームをシーケンシャルに読み込み、入力されるテキストストリームをレコードセパレータ毎に区切り、1行毎にスクリプトに記述されたアクションを順次実行する。

ファーストクラスのデータ型は、数値と文字列である。

他に文字列をキーとした連想配列があるが、連想配列はファーストクラスではなく関数の返戻値にできないなどデータというよりは、配列変数という変種の変数があるといったような扱いである。連想配列の中身を連想配列にすることはできないため、ループするようなデータ構造を作ることは不可能。連想配列のキーに数値を使うと、文字列に変換したものがキーとなる。 lang=awkのようにして多次元配列のように見えるアクセスもできるが、実際には各次元を必要であればまず文字列化した後に、グローバル変数lang=awkの文字列をセパレータとして連結した文字列をキーとしてアクセスする。

スクリプトの基本構成は次のようになる。

lang=awk，lang=awkアクションは必須ではない。

例として、テキストファイル内の全ての行のうち、空行の数と「林檎」・「りんご」または「リンゴ」という文字列を含む行の数をそれぞれ出力するAWKプログラムを示す。

なお、AWKでは、まだ代入されていない変数は暗黙のうちにlang=awkまたはlang=awkで初期化されると仮定してよいので、上の例でのlang=awkブロックは必須ではない。

パターンには以下のように開始と終了を定義するパターンもある。

例えば、以下のようなプログラムは、「」を含む行から「」を含む行までの間、指定されたアクションが実行する。

2.2. 変数
-------

AWKの特徴の一つとして変数が型を持たないことが挙げられる。変数宣言が不要で、プログラム中で使用される変数は暗黙のうちに初期化される。このため、未定義変数や未初期化変数を参照することによるエラーはAWKには存在しない。

AWKは算術演算のような数値を必要とする文脈では暗黙に値を数値に変換し、逆に文字列を必要とする場合には文字列に変換する。 例えば、 のような例では、lang=awkおよびlang=awkの値はlang=awkになる。

こうした暗黙の変換は便利であると同時に、利用者の意図しない結果を生むこともある。

また、変数に入っているのがどちらかわからないが、必ず数値が必要という場合などにlang=awkのように0を足したり、逆に必ず文字列が必要という場合などにlang=awkのように""を結合させたりする、という常套手段がある。

2.3. 関数
-------

AWKでは、関数を定義して使用することが可能である。

関数の定義は次のようになる。

AWKの変数は、引数を除いて全て大域変数であり、局所のスコープを持つのは引数として宣言された変数だけである。このため、技法として、関数定義で余分な引数を宣言し、それを局所変数として使う、ということが行なわれる。AWKでは、関数の呼び出し時に、実引数の個数が仮引数の個数より少なくても、省略とみなしエラーとしない。これを利用して、余分な引数を局所変数として使うのである。

このように関数を定義した上で，呼び出すときに引数を3つしか使わなければ、lang=awk以降は局所変数として扱える。構文上の区別は無いが、判読性を向上させるために両者の間に十分な空白を挿入するのが慣例になっている。

また、関数は再帰呼び出しもできる。

2.4. 制御構造
---------

AWKの制御構造には以下のようなものがある。

if文
for/while文
その他 以降の文の実行および以降のパターン処理をせずに、次のレコードの処理を開始する 現在の入力ファイルの残りを読み込まずに、次のファイルの処理を開始する 関数の処理を停止し、関数の呼び出し元に制御を戻す。値が指定されてあれば値を返す。 プログラムの実行を終了させるまた、制御構造の他に、以下の文がある。

連想配列の全部ないし一部の要素を削除

3. AWKの処理系
----------

もともとのAWKは、UNIXに付属していたものであったが、 様々なプラットフォームに移植された他、GNU AWKを代表に、他の実装も多い。

旧版 1970年代後半から1980年頃開発されていたもので、V7の頃のUNIXに付属、『UNIXプログラミング環境』4.4節での説明で使われている版でもある。関数のユーザー定義ができないのが、現在と比べると大きな制限である。これ、ないし次を指して、日本ではくだけた感じで「元祖」などと呼ぶ。 nawk 1980年代後半頃までのバージョンアップにより登場したもので、SVR3の頃のUNIXに付属。旧バージョンと区別してnawkとも。関数のユーザー定義などの機能が追加された。一つの真正の、といった感じで、他と区別する場合はone true awkなどとも呼ばれる。FreeBSDの/usr/bin/awkなどはこれである。大きな機能追加などは以前から無いが、現在もメンテナンスされている。 FreeBSD、NetBSD、OpenBSD、macOS、illumos、Android などで使用されている。 gawk GNUプロジェクトによるAWKの実装。GNU/Linuxディストリビューションではawkという名前のプログラムがこの実装であることが多い。POSIX 1003.2コマンド言語とユーティリティ規約に定められた言語の定義に適合している。マルチバイト文字への対応やネットワークへの接続機能など、オリジナルのAWKには無い多数の拡張が加えられており、現在もバージョンアップが続いている。

jgawk gawk がマルチバイト文字に対応する以前に作られた gawk の日本語文字対応拡張版。

mawk マイク・ブレナン作。旧版のawkに少数の拡張が加えられている。バイトコードに変換されて実行されるため，高速な動作が期待できる。またgawkよりもバイナリサイズが小さい。

mawk MBCS 木村浩一によるmawkのマルチバイト拡張。

標準 AWKはawkとしてIEEE Std 1003.1-2017で標準化されている。また、Linux Standard Baseでも指定コマンドになっている。

4. 脚注
-----

4.1. 注釈
-------

4.2. 出典
-------

5. 参考文献
-------

プログラミング言語AWK
- 「AWK book」などと呼ばれ、C言語におけるK&Rのような扱いの本である。日本版は版元の出版事業撤退により最初に絶版となる。
- トッパン 1989年刊の再刊。
- 新紀元社から復刊されたものの、3度目の絶版となる。
- ユニバーサル・シェル・プログラミング研究所から3度目の復刊がなされた。
- アスキーの256本のひとつで、通称「AWK256本」とも呼ばれており、現在も販売中のベストセラーである。

6. 関連項目
-------

sed
Perl
Ruby

7. 外部リンク
--------

[1] - の日本語訳
[2] — 弘前大学 教育学部 教育実践研究指導センター 小山智史
[3]