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 1iteration 2iteration 3iteration 4
break 和 continue
此外,如同 C 语言一样,awk 提供了 break 和 continue 语句 。使用这些语句可以更好地控制 awk 的循环结构 。以下是迫切需要 break 语句的代码片断:
while 死循环
while (1) { print "forever and ever..."}
因为 1 永远代表是真,这个 while 循环将永远运行下去 。以下是一个只执行十次的循环:
break 语句示例
x=1while(1) { print "iteration",x if ( x == 10 ) { break } x}
这里,break 语句用于“逃出”最深层的循环 。"break" 使循环立即终止,并继续执行循环代码块后面的语句 。
continue 语句补充了 break,其作用如下:
x=1while (1) { if ( x == 4 ) { xcontinue } 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 在数组下标之间轮转时,它不会依照任何特定的顺序 。那就意味着我们不能知道以上代码的输出是
jim456
还是
456jim
套用 Forrest Gump 的话来说,迭代数组内容就像一盒巧克力 -- 您永远不知道将会得到什么 。因此有必要使 awk 数组“字符串化”,我们现在就来研究这个问题 。
数组下标字符串化
在我的前一篇文章中,我演示了 awk 实际上以字符串格式来存储数字值 。虽然 awk 要执行必要的转换来完成这项工作,但它却可以使用某些看起来很奇怪的代码:
a="1"b="2"c=a b 3
执行了这段代码后,c 等于 6 。由于 awk 是“字符串化”的,添加字符串 "1" 和 "2" 在功能上并不比添加数字 1 和 2 难 。这两种情况下,awk 都可以成功执行运算 。awk 的“字符串化”性质非常可爱 -- 您可能想要知道如果使用数组的字符串下标会发生什么情况 。例如,使用以下代码:
myarr["1"]="Mr. Whipple"print myarr["1"]
可以预料,这段代码将打印 "Mr. Whipple" 。但如果去掉第二个 "1" 下标中的引号,情况又会怎样呢?
推荐阅读
- 通用线程--sed 实例,第3部分
- 通用线程--sed 实例,第1部分
- 通用线程--sed 实例,第2部分
- FreeBSD下设置modem和modem的通用命令
- 什么叫多线程
- 和彩云支持普通用户上传多大文件
- 缝好衣服后怎么用短线快速打结?男女通用
- 医保是全国通用的吗
- 5e和steam皮肤通用吗
- 下 Solaris 10通用桌面CDE快速入门