shell文字過濾程式設計(六):awk之迴圈判斷及陣列
阿新 • • 發佈:2019-02-20
與上一節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]
示例:
Awk陣列的下標還可以使用字串。awk 將 arr["1"] 和 arr[1] 看作同一個元素。#!/bin/sh echo"" | awk ' BEGIN { a[1]="123" a[2]="456" a[3]="789" } END{ for(i in a) { print a[i] } }'
示例:
#!/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