awk の配列

配列と連想配列は、個人的には Perl をやり始めた時の難関であり、awk をやり始めた時の難関でした。(その前に使っていた BASIC では配列を使ったことがなかったので・・・)

そもそも配列とは、ある添字 (数値) を持つような変数の一種であり、良く数学で a1, a2 (1, 2 は下添字) で記載されているようなものです。数学の教科書では級数のような場合に使われ、a1, a2, ... an というような表記を見たことがあると思います。つまり、固定された変数名ではなく、ある不特定な添字を使って数を増減できる変数のようなものです。
どんなメリットがあるかというと、何個の変数になるかわからないものに対して用いることで無駄に長い変数名を考える必要がありません。あるファイルの行の内容を記憶させたい場合など、そのファイルの行数が分からない場合に用いたりします。
この a1, a2, ... an を awk の世界では a[1], a[2], ... a[n] と書きます。

次に連想配列ですが、上の配列で数字が文字列に置き換わっただけだと考えてもらえれば良いと思います。英語では Associative Array で、多分「関連配列」と言った方が分かりやすいかもしれませんが、連想配列と言われ、場合によってはハッシュとか辞書配列とも呼ばれます (まぁ大意そう思ってください)。
例えば、「アメリカの人口」「日本の人口」といったように、同じ「人口」なんだけれど「アメリカ」と「日本」という部分が異なるような場合に用いられます。人口を表す連想配列を population とすれば、awk では population["アメリカ"], population["日本"] と記述できます。

この配列と連想配列は本来は異なるものですが、添字付きの変数という意味では同じです。これを awk では同じに扱うために「全て連想配列」にしています。つまり上で書いた、a[1], a[2] は a["1"], a["2"] と同義になります。しかも、添字の部分に数値演算子や文字列演算子を混在でき、関数定義の引数の部分では変数名のように配列名を扱うことができ、これらを awk がちゃんと自動で解釈してくれます。
もちろん、決してデメリットがないわけではなく、Perl のようなスマートな (?) 記述ができなかったり、配列に比べて連想配列を扱う方が実効速度が遅かったりします。

賛否両論あるものの awk連想配列として扱う方法は初心者に広く受け入れられ、誰でも扱える LL の基盤を築きました。今でも、配列を連想配列として扱う言語はいくつか存在しています。