7.4.4 The for Statement

The for statement makes it more convenient to count iterations of a loop. The general form of the for statement looks like this:

for (initialization; condition; increment)
  body

The initialization, condition, and increment parts are arbitrary awk expressions, and body stands for any awk statement.

The for statement starts by executing initialization. Then, as long as the condition is true, it repeatedly executes body and then increment. Typically, initialization sets a variable to either zero or one, increment adds one to it, and condition compares it against the desired number of iterations. For example:

awk '
{
    for (i = 1; i <= 3; i++)
        print $i
}' inventory-shipped

This prints the first three fields of each input record, with one input field per output line.

C and C++ programmers might expect to be able to use the comma operator to set more than one variable in the initialization part of the for loop, or to increment multiple variables in the increment part of the loop, like so:

for (i = 0, j = length(a); i < j; i++, j--) ...   C/C++, not awk!

You cannot do this; the comma operator is not supported in awk. There are workarounds, but they are nonobvious and can lead to code that is difficult to read and understand. It is best, therefore, to simply write additional initializations as separate statements preceding the for loop and to place additional increment statements at the end of the loop’s body.

Most often, increment is an increment expression, as in the earlier example. But this is not required; it can be any expression whatsoever. For example, the following statement prints all the powers of two between 1 and 100:

for (i = 1; i <= 100; i *= 2)
    print i

If there is nothing to be done, any of the three expressions in the parentheses following the for keyword may be omitted. Thus, ‘for (; x > 0;) is equivalent to ‘while (x > 0). If the condition is omitted, it is treated as true, effectively yielding an infinite loop (i.e., a loop that never terminates).

In most cases, a for loop is an abbreviation for a while loop, as shown here:

initialization
while (condition) {
  body
  increment
}

The only exception is when the continue statement (see The continue Statement) is used inside the loop. Changing a for statement to a while statement in this way can change the effect of the continue statement inside the loop.

The awk language has a for statement in addition to a while statement because a for loop is often both less work to type and more natural to think of. Counting the number of iterations is very common in loops. It can be easier to think of this counting as part of looping rather than as something to do inside the loop.

There is an alternative version of the for loop, for iterating over all the indices of an array:

for (i in array)
    do something with array[i]

See Scanning All Elements of an Array for more information on this version of the for loop.