當前位置:
首頁 > 知識 > 在 awk 中怎麼使用循環

在 awk 中怎麼使用循環

在 awk 中怎麼使用循環


來學習一下多次執行同一條命令的不同類型的循環。-- Seth Kenlon(作者)

awk 腳本有三個主要部分:BEGIN 和 END 函數(都可選),用戶自己寫的每次要執行的函數。某種程度上,awk 的主體部分就是一個循環,因為函數中的命令對每一條記錄都會執行一次。然而,有時你希望對於一條記錄執行多次命令,那麼你就需要用到循環。

有多種類型的循環,分別適合不同的場景。


while 循環

一個 while 循環檢測一個表達式,如果表達式為 true 就執行命令。當表達式變為 false 時,循環中斷。

#!/bin/awk -f

BEGIN {
# Loop through 1 to 10

i=1;
while (i <= 10) {
print i, " to the second power is ", i*i;
i = i+1;
}
exit;
}

在這個簡單實例中,awk 列印了放在變數 i 中的整數值的平方。while (i <= 10) 語句告訴 awk 僅在 i 的值小於或等於 10 時才執行循環。在循環最後一次執行時(i 的值是 10),循環終止。


do-while 循環

do-while 循環執行在關鍵字 do 之後的命令。在每次循環結束時檢測一個測試表達式來決定是否終止循環。僅在測試表達式返回 true 時才會重複執行命令(即還沒有到終止循環的條件)。如果測試表達式返回 false,因為到了終止循環的條件所以循環被終止。

#!/usr/bin/awk -f
BEGIN {

i=2;
do {
print i, " to the second power is ", i*i;
i = i + 1
}
while (i < 10)

exit;
}

for 循環

awk 中有兩種 for 循環。

一種 for 循環初始化一個變數,檢測一個測試表達式,執行變數遞增,當表達式的結果為 true 時循環就會一直執行。

#!/bin/awk -f

BEGIN {
for (i=1; i <= 10; i++) {
print i, " to the second power is ", i*i;
}
exit;
}

另一種 for 循環設置一個有連續索引的數組變數,對每一個索引執行一個命令集。換句話說,它用一個數組「收集」每一條命令執行後的結果。

本例實現了一個簡易版的 Unix 命令 uniq。通過把一系列字元串作為鍵加到數組 a 中,當相同的鍵再次出現時就增加鍵值,可以得到某個字元串出現的次數(就像 uniq 的 --count 選項)。如果你列印該數組的所有鍵,將會得到出現過的所有字元串。

用演示文件 colours.txt(前一篇文章中的文件)來舉例:

name color amount
apple red 4
banana yellow 6
raspberry red 99
strawberry red 3
grape purple 10
apple green 8
plum purple 2
kiwi brown 4
potato brown 9
pineapple yellow 5

這是 awk 版的簡易 uniq -c:

#! /usr/bin/awk -f

NR != 1 {
a[$2]++
}
END {
for (key in a) {
print a[key] " " key
}
}

示例數據文件的第三列是第一列列出的條目的計數。你可以用一個數組和 for 循環來按顏色統計第三列的條目。

#! /usr/bin/awk -f

BEGIN {
FS=" ";
OFS=" ";
print("color sum");
}
NR != 1 {
a[$2]+=$3;
}
END {
for (b in a) {
print b, a[b]
}
}

你可以看到,在處理文件之前也需要在 BEFORE 函數(僅僅執行一次)中列印一列表頭。


循環

在任何編程語言中循環都是很重要的一部分,awk 也不例外。使用循環你可以控制 awk 腳本怎樣去運行,它可以統計什麼信息,還有它怎麼去處理你的數據。我們下一篇文章會討論 switch、continue 和 next 語句。



via: https://opensource.com/article/19/11/loops-awk

作者: Seth Kenlon 選題: lujun9972 譯者: lxbwolf 校對: wxy

本文由 LCTT 原創編譯, Linux中國 榮譽推出


點擊「了解更多」可訪問文內鏈接

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!


請您繼續閱讀更多來自 Linux技術 的精彩文章:

2020 年勒索軟體將繼續流行
iOS 應用程序有望從新提議的 Security.plist 標準中受益