awk基础知识(10)-循环结构

发布时间:2020-05-31编辑:脚本学堂
循环结构
awk 的 while 循环结构,它等同于相应的 C 语言 while 循环。
awk 还有 "do...while" 循环,它在代码块结尾处对条件求值,而不象标准 while 循环那样在开始处求值。
它类似于其它语言中的 "repeat...until" 循环。

循环结构
linuxjishu/13830.html target=_blank class=infotextkey>awk 的 while 循环结构,它等同于相应的 C 语言 while 循环。
awk 还有 "do...while" 循环,它在代码块结尾处对条件求值,而不象标准 while 循环那样在开始处求值。
它类似于其它语言中的 "repeat...until" 循环。
示例:
do...while 示例 {
     count=1
     do {
    print "I get printed at least once no matter what"
    } while ( count != 1 )
}

与一般的 while 循环不同,由于在代码块之后对条件求值,"do...while" 循环永远都至少执行一次。
换句话说,当第一次遇到普通 while 循环时,如果条件为假,将永远不执行该循环。

for 循环
awk 允许创建 for 循环,它就象 while 循环,也等同于 C 语言的 for 循环:
for ( initial assignment; comparison; increment ) {
 code block
}

示例:
for ( x = 1; x <= 4; x++ ) {
    print "iteration",x
}

此段代码将打印:
iteration 1
iteration 2
iteration 3
iteration 4

breakcontinue
此外,如同 C 语言一样,awk 提供了 break 和 continue 语句。使用这些语句可以更好地控制 awk 的循环结构。以下是迫切需要 break 语句的代码片断:

while 死循环
while (1) {
  print "forever and ever..."
}
因为 1 永远代表是真,这个 while 循环将永远运行下去。以下是一个只执行十次的循环:

break 语句示例 x=1
while(1) {
   print "iteration",x
   if ( x == 10 ) {
      break
   }
  x++
}

这里,break 语句用于“逃出”最深层的循环。"break" 使循环立即终止,并继续执行循环代码块后面的语句。
continue 语句补充了 break,其作用如下:
x=1
while (1) {
    if ( x == 4 ) {
      x++
      continue
     }
     print "iteration",x
     if ( x > 20 ) {
         break
     }
     x++
}

这段代码打印 "iteration 1" 到 "iteration 21","iteration 4" 除外。如果迭代等于 4,则增加 x 并调用 continue 语句,该语句立即使 awk 开始执行下一个循环迭代,而不执行代码块的其余部分。如同 break 一样,continue 语句适合各种 awk 迭代循环。在 for 循环主体中使用时,continue 将使循环控制变量自动增加。以下是一个等价循环:
for ( x=1; x<=21; x++ ) {
    if ( x == 4 ) {
        continue
    }
    print "iteration",x
}

在 while 循环中时,在调用 continue 之前没有必要增加 x,因为 for 循环会自动增加 x。

数组
如果您知道 awk 可以使用数组,您一定会感到高兴。然而,在 awk 中,数组下标通常从 1 开始,而不是 0:
myarray[1]="jim"
myarray[2]=456

awk 遇到第一个赋值语句时,它将创建 myarray,并将元素 myarray[1] 设置成 "jim"。执行了第二个赋值语句后,数组就有两个元素了。

数组迭代

定义之后,awk 有一个便利的机制来迭代数组元素,如下所示:
for ( x in myarray ) {
  print myarray[x]
}

这段代码将打印数组 myarray 中的每一个元素。当对于 for 使用这种特殊的 "in" 形式时,awk 将 myarray 的每个现有下标依次赋值给 x(循环控制变量),每次赋值以后都循环一次循环代码。虽然这是一个非常方便的 awk 功能,但它有一个缺点 -- 当 awk 在数组下标之间轮转时,它不会依照任何特定的顺序。那就意味着我们不能知道以上代码的输出是:
jim
456
还是:
456
jim
迭代数组内容就像一盒巧克力-您永远不知道将会得到什么。