來學習一下屢次執行同一條命令的不一樣類型的循環。linux
awk
腳本有三個主要部分:BEGIN
和 END
函數(均可選),用戶本身寫的每次要執行的函數。某種程度上,awk
的主體部分就是一個循環,由於函數中的命令對每一條記錄都會執行一次。然而,有時你但願對於一條記錄執行屢次命令,那麼你就須要用到循環。git
有多種類型的循環,分別適合不一樣的場景。github
一個 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
以後的命令。在每次循環結束時檢測一個測試表達式來決定是否終止循環。僅在測試表達式返回 true
時纔會重複執行命令(即尚未到終止循環的條件)。若是測試表達式返回 false
,由於到了終止循環的條件因此循環被終止。bash
#!/usr/bin/awk -f
BEGIN {
i=2;
do {
print i, " to the second power is ", i*i;
i = i + 1
}
while (i < 10)
exit;
}
複製代碼
awk
中有兩種 for
循環。app
一種 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
選項)。若是你打印該數組的全部鍵,將會獲得出現過的全部字符串。oop
用演示文件 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="\t";
print("color\tsum");
}
NR != 1 {
a[$2]+=$3;
}
END {
for (b in a) {
print b, a[b]
}
}
複製代碼
你能夠看到,在處理文件以前也須要在 BEFORE
函數(僅僅執行一次)中打印一列表頭。
在任何編程語言中循環都是很重要的一部分,awk
也不例外。使用循環你能夠控制 awk
腳本怎樣去運行,它能夠統計什麼信息,還有它怎麼去處理你的數據。咱們下一篇文章會討論 switch
、continue
和 next
語句。
via: opensource.com/article/19/…
做者:Seth Kenlon 選題:lujun9972 譯者:lxbwolf 校對:wxy