1. 程式人生 > >shell文字過濾程式設計(六):awk之迴圈判斷及陣列

shell文字過濾程式設計(六):awk之迴圈判斷及陣列

與上一節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