您好,登錄后才能下訂單哦!
awk中的使用循環是怎么樣的,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
導讀 | awk 腳本有三個主要部分:BEGIN 和 END 函數(都可選),用戶自己寫的每次要執行的函數。某種程度上,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),循環終止。 [yiji]do-while 循環[/yiji] 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 腳本怎樣去運行,它可以統計什么信息,還有它怎么去處理你的數據。
看完上述內容,你們掌握awk中的使用循環是怎么樣的的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。