在 awk 中怎麼使用循環

來學習一下屢次執行同一條命令的不一樣類型的循環。linux

awk 腳本有三個主要部分:BEGINEND 函數(均可選),用戶本身寫的每次要執行的函數。某種程度上,awk 的主體部分就是一個循環,由於函數中的命令對每一條記錄都會執行一次。然而,有時你但願對於一條記錄執行屢次命令,那麼你就須要用到循環。git

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

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,由於到了終止循環的條件因此循環被終止。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;
}
複製代碼

for 循環

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 腳本怎樣去運行,它能夠統計什麼信息,還有它怎麼去處理你的數據。咱們下一篇文章會討論 switchcontinuenext 語句。


via: opensource.com/article/19/…

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

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

相關文章
相關標籤/搜索