在 awk 中怎麼使用迴圈
來學習一下多次執行同一條命令的不同型別的迴圈。
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="\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: https://opensource.com/article/19/11/loops-awk
作者:Seth Kenlon 選題:lujun9972 譯者:lxbwolf 校對:wxy
相關文章
- awk中使用迴圈
- for迴圈在Python中是怎麼工作的Python
- AWK if(條件)語句與迴圈簡介
- python怎麼迴圈巢狀Python巢狀
- 你還在Java8中使用迴圈語句嗎?Java
- Spring怎麼解決迴圈依賴?Spring
- 為什麼不建議在for迴圈中使用"+"進行字串拼接字串
- 在Unity中檢測死迴圈和卡死Unity
- js中在迴圈中使用正規表示式遇到的小坑JS
- C#程式設計基礎第七課:C#中的基本迴圈語句:while迴圈、do-while迴圈、for迴圈、foreach迴圈的使用C#程式設計While
- 迴圈中的非同步&&迴圈中的閉包非同步
- [譯] 減少 Python 中迴圈的使用Python
- Python中for迴圈和while迴圈有什麼區別?Python入門教程PythonWhile
- scss中迴圈之@for迴圈佈局畫圓CSS
- 記錄在JavaScript中對事件迴圈的理解JavaScript事件
- kotlin的迴圈使用Kotlin
- php 迴圈裡面套sql怎麼解決PHPSQL
- Spring 是怎麼處理迴圈依賴的?Spring
- cmd執行python死迴圈怎麼解決Python
- Python迴圈引用是什麼?如何避免迴圈引用?Python
- 使用增強型for迴圈(for-each)相比傳統的for迴圈有什麼區別?
- JAVA多層迴圈裡面怎麼一個break直接跳出到最外層迴圈位置Java
- 在Linux中,如何使用awk和sed進行文字處理?Linux
- python:運用while迴圈怎麼進行終止PythonWhile
- 為什麼阿里巴巴不建議在for迴圈中使用"+"進行字串拼接阿里字串
- 為什麼阿里巴巴不建議在for迴圈中使用”+”進行字串拼接阿里字串
- 在Linux中,shell指令碼中的條件語句和迴圈結構是什麼?Linux指令碼
- [Python]在一段Python程式中使用多次事件迴圈Python事件
- js在迴圈中使用正則失效異常的坑JS
- js中為什麼for迴圈比forEach效能高?JS
- for 迴圈與 while 迴圈While
- while迴圈 case迴圈While
- 怎樣使用 awk 刪掉檔案中重複的行
- C語言——迴圈結構(for迴圈,while迴圈,do-while迴圈)C語言While
- 理解 JavaScript 中的迴圈JavaScript
- Node中的事件迴圈事件
- Go 1.22 中的 For 迴圈Go
- JavaScript中的while迴圈JavaScriptWhile