1 第6.4节:awk语言 for 语句

for 语句让统计循环迭代次数变得更加便捷。for 语句的一般形式如下:

for (initialization; condition; increment)
    body

initialization(初始化 )、condition(条件 )和 increment(增量 )部分可以是任意 awk 表达式,body 代表任意 awk 语句。

for 语句的执行流程是:先执行 initialization。之后,只要 condition 为真,就会重复执行 body,然后执行 increment。通常,initialization 会把一个变量设为 0 或 1,increment 会给该变量加 1,condition 则会将其与期望的迭代次数做比较。例如:

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

这段代码会打印每个输入记录的前三个字段,每个字段单独占一行输出。

熟悉 C 和 C++ 的程序员可能会期望能使用逗号运算符,在 for 循环的 initialization 部分设置多个变量,或者在循环的 increment 部分递增多个变量,像这样:

for (i = 0, j = length(a); i < j; i++, j--) ...  // C/C++ 写法,不是 awk 的!

但在 awk 中无法这样做,因为 awk 不支持逗号运算符。虽然有变通方法,但这些方法并不直观,还可能导致代码难以阅读和理解。因此,最好的做法是,在 for 循环之前,把额外的初始化操作写成单独的语句;在循环体末尾,把额外的增量操作也写成单独的语句。

多数情况下,increment 是一个增量表达式,就像前面的例子那样。但这不是强制要求,它可以是任意表达式。比如,以下语句会打印出 1 到 100 之间的所有 2 的幂:

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

如果不需要执行任何操作,for 关键字后面括号里的三个表达式中的任意一个都可以省略。比如,for (; x > 0;) 等价于 while (x > 0) 。如果省略 condition,它会被视为真,实际上就会产生一个无限循环(即永远不会终止的循环 )。

在大多数情况下,for 循环是 while 循环的一种简写形式,如下所示:

initialization
while (condition) {
    body
    increment
}

唯一的例外是,当在循环内部使用 continue 语句时。把 for 语句改写成 while 语句的形式,可能会改变循环内部 continue 语句的效果。

awk 语言既有 for 语句又有 while 语句,是因为 for 循环在需要统计迭代次数的场景中,写起来更省事、思考起来更自然。把计数操作视为循环的一部分,而不是循环内部要做的事,可能会更容易。

for 循环还有另一种变体,用于遍历数组的所有下标:

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

作者声明:本文用于记录和分享作者的学习心得,可能有部分文字或示例来自AI平台,如:豆包、DeepSeek(硅基流动)(注册链接)等,由于本人水平有限,难免存在表达错误,欢迎留言交流和指教!
Copyright © 2022~2025 All rights reserved.

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐