for文
for文は、ループの繰り返しのカウントがさらに行いやすい文です。for文の一般的な形式は次のようになります。
for (initialization; condition; increment)
body
この文はinitializationの実行から始まります。次に、conditionが真である間、bodyが繰り返し実行され、次にincrementが行われます。通常、initializationでは変数は0か1のどちらかに設定され、incrementでは変数に1が加えられ、conditionでは変数と指定した繰り返し回数とが比較されます。
次に、for文の例を示します。
awk '{ for (i = 1; i <= 3; i++)
print $i
}'
これは、各入力レコードの最初の3つのフィールドを、1行に1フィールドづつ表示します。
for文では、bodyは任意の文を意味しますが、initialization、condition、incrementは式です。x = y = 0のような、すべての初期値が等しい場合にのみ可能な複数代入文を使わない限り、initialization部分で2つ以上の変数を設定することはできません(しかし、forループの前に、別の文として代入を行うことにより、他の変数を初期化できます)。
同じことがincrement部分にも当てはまります。つまり、他の変数をインクリメントするには、ループの終りに別の文を書かなければなりません。Cのカンマ演算子を使ったCの複合式は、このような場合に便利ですが、awkではサポートされていません。
上の例のように、ほとんどの場合、INCREMENTはインクリメント式です。しかし、インクリメント式である必要はありません。どのような式でもかまいません。たとえば、次の文は1〜100までの2の累乗をすべて表示します。
for (i = 1; i <= 100; i *= 2) print i
forのあとのカッコで囲まれた3つの式は、そこで行うべきことがない場合はどれでも省略できます。したがって、`for (;x > 0;)'は`while (x > 0)'と同じです。conditionが省略された場合は、trueとして扱われます。これは事実上、無限ループとなります。
多くの場合、forループは次に示すようなwhileループの省略です。
initialization
while (condition) {
body
increment
}
唯一の例外は、continue文(see section continue文)をループの中で使ったときです。このようにして、for文をwhile文に変えると、ループの中のcontinue文の結果が変わってきます。
forループの別の形を次に示します。これは、配列の添字をすべて繰り返します。
for (i in array)
do something with array[i]
この形のforループの詳細については、See section awkの配列。
awk言語に、while文に加えてfor文が用意されているのは、forループはタイプ回数が少なくて済むという理由と、より自然な発想で使えるという理由からです。繰り返しの回数のカウントは、ループでは非常によく行われることです。カウントは、ループの中で行われることと考えるよりも、ループの一部と考える方が簡単です。
次の節では、さらに複雑なforループの例について説明します。