在 awk 中怎麼使用迴圈

2019-12-02 23:31:00

來學習一下多次執行同一條命令的不同型別的迴圈。

awk 指令碼有三個主要部分:BEGINEND 函數(都可選),使用者自己寫的每次要執行的函數。某種程度上,awk 的主體部分就是一個迴圈,因為函數中的命令對每一條記錄都會執行一次。然而,有時你希望對於一條記錄執行多次命令,那麼你就需要用到回圈。

有多種型別的迴圈,分別適合不同的場景。

while 迴圈

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

#!/bin/awk -fBEGIN {        # 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 -fBEGIN {        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 -fBEGIN {    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  amountapple      red    4banana     yellow 6raspberry  red    99strawberry red    3grape      purple 10apple      green  8plum       purple 2kiwi       brown  4potato     brown  9pineapple  yellow 5

這是 awk 版的簡易 uniq -c

#! /usr/bin/awk -fNR != 1 {    a[$2]++}END {    for (key in a) {                print a[key] " " key    }}

範例資料檔案的第三列是第一列列出的條目的計數。你可以用一個陣列和 for 迴圈來按顏色統計第三列的條目。

#! /usr/bin/awk -fBEGIN {    FS=" ";    OFS="\t";    print("color\tsum");}NR != 1 {    a[$2]+=$3;}END {    for (b in a) {        print b, a[b]    }}

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

迴圈

在任何程式語言中迴圈都是很重要的一部分,awk 也不例外。使用迴圈你可以控制 awk 指令碼怎樣去執行,它可以統計什麼資訊,還有它怎麼去處理你的資料。我們下一篇文章會討論 switchcontinuenext 語句。