• 本页内容

73. for 循环语句


awk for 语句在功能上与 awk while 循环相同,但 for 语句语法更易于使用。

语法:

for(initialization;condition;increment/decrement)
    actions

awk for 语句首先执行初始化,然后检查条件。如果条件为真,则执行操作,然后递增或递减。只要条件为真,awk 就会重复执行该操作,然后执行递增/递减。

以下示例打印一行中字段的总和。最初变量 i 被初始化为 1; 如果 i 小于或等于字段总数,则将当前字段添加到总数中; i 递增并重复测试。

$ echo "1 2 3 4" | awk \
'{ for (i = 1; i <= NF; i++) total = total+$i }; \
END { print total }'
10 

以下示例使用 for 循环以相反顺序打印文件中的所有字段。请注意,这在 for 循环中使用递减而不是递增。 读入每一行后,Awk 将 NF 变量设置为该行上找到的字段数。

此示例从 NF 开始到 1 以相反的顺序循环,并逐个输出字段。 它以字段 $NF 开头,然后是 $(NF-1) , …, $1 。之后它会打印一个换行符。

反过来举例:

$ cat forreverse.awk
BEGIN {
    ORS="";
}
{
    for (i=NF; i >0; i--)
        print $i," "
    print "\n";
}

$ awk -f forreverse.awk items-sold.txt
12 10 8 5 10 2 101
2 0 3 4 1 0 102
13 5 20 11 6 10 103
5 6 0 4 3 2 104
6 12 7 5 2 10 105

现在,我们将展示用于打印 items-sold.txt 文件中每件商品的销售总量的程序的 for 循环版本。 我们之前展示了 while-loopdo-while-loop 版本。

$ cat for.awk
{
    total=0;
    for (i=2; i <= NF; i++)
        total = total + $i;
    print "Item", $1, ":", total, "quantities sold";
}

$ awk -f for.awk items-sold.txt
Item 101 : 47 quantities sold
Item 102 : 10 quantities sold
Item 103 : 65 quantities sold
Item 104 : 20 quantities sold
Item 105 : 42 quantities sold