首页 > 代码库 > shell文本过滤编程(六):awk之循环判断及数组

shell文本过滤编程(六):awk之循环判断及数组

【版权声明:转载请保留出处:blog.csdn.net/gentleliu。Mail:shallnew at 163 dot com】

与上一节printf一样,awk的循环判断和C语言的循环判断语法极其类似。
1、 While循环

#!/bin/sh
 
awk '
BEGIN {
    ORS=""
}
{
    i=0
    while (i < NF) {
        printf("* ")
        i++
    }
    print "\n"
}
' group_file1


首先,将输出记录分隔符 ORS 设置成 ""(空),它将使 print 语句在每个调用结尾不输出新行。这意味着如果希望任何文本从新的一行开始,那么需要明确写入 print "\n"。
在代码中,设置变量i来存储当前中处理字段编号,对每一行记录,i首先设置为0,然后对每一字段打印一个“*”,每一行记录打印完之后打印一个换行,由于将 ORS 设置成 "",print将不输出2个换行。下面为打印结果:

#./7_awk_while.sh
* * * 
* * * 
* * * 
* * * * 
* * * 
#


2、 do…while循环
awk 还有"do...while" 循环,它在代码块结尾处对条件求值,而不象标准 while 循环那样在开始处求值。
示例(输出六个*号):

#!/bin/sh
 
echo "" | awk '
{
    i=0
    do {
        printf("* ")
    }while (i++ < 5)
    printf("\n")
}'

与一般的 while 循环不同,由于在代码块之后对条件求值,"do...while" 循环永远都至少执行一次。
换句话说,当第一次遇到普通 while 循环时,如果条件为假,将永远不执行该循环。
3、 for循环
awk 允许创建 for 循环,它就象 while 循环,也等同于 C 语言的 for 循环:
for ( initial assignment; comparison; increment ) {
 code block
}

示例(同样连续输出5个*):
#!/bin/sh
 
echo"" | awk '
{
    for (i=0; i<5; i++) {
        printf("* ")
    }
    printf("\n")
}'

使用过C语言的会发现,Awk的循环操作和C语言的循环操作语法极其类似。
Awk也支持数组,数组使用前,不必定义,也不必指定数组元素个数。经常使用循环来访问数组。下面是一种循环类型的基本结构:
For (element inarray ) print array[element]
示例:
#!/bin/sh
 
echo"" | awk '
BEGIN {
    a[1]="123"
    a[2]="456"
    a[3]="789"
}
 
END{
    for(i in a) {
        print a[i]
    }
}'
Awk数组的下标还可以使用字符串。awk 将 arr["1"] 和 arr[1] 看作同一个元素。
示例:
#!/bin/sh
 
echo"" | awk '
BEGIN {
    a[1]="123"
    a[2]="456"
    a[3]="789"
 
   a["hello"]="awk"
    a["3"]="world"
}
 
{
    for(i in a) {
        print a[i]
    }
}
 
END {
    print "======end========"
    print a[3]
    print a["3"]
}
'

输出结果为:
awk
123
456
world
======end========
world
world

shell文本过滤编程(六):awk之循环判断及数组