跳轉至內容

Awk 入門/控制結構

來自華夏公益教科書,開放的書籍,開放的世界

Awk 支援類似於 C 中使用的控制結構,包括

  • if ... else
  • while
  • for
  • break
  • continue

還有一些與 C 中不同的控制結構

  • for (x in a) - 陣列迴圈
  • next - 轉到下一個輸入記錄
  • exit - 停止處理輸入檔案,執行 END 操作(如果指定),然後結束。

if ... else

[編輯 | 編輯原始碼]

"if ... else" 的語法為

   if (<condition>) <action 1> [else <action 2>]

"else" 子句是可選的。 "condition" 可以是模式匹配部分中討論的任何表示式,包括與正則表示式的匹配。 例如,考慮以下 Awk 程式

{
   if ($1=="green") print "GO";
   else if ($1=="yellow") print "SLOW DOWN";
   else if ($1=="red") print "STOP";
   else print "SAY WHAT?";
}

(在這裡,分號是可選的,可以省略。)

順便說一下,為了測試目的,這個程式可以呼叫為

   echo "red" | awk -f pgm.txt

—其中 "pgm.txt" 是包含該程式的文字檔案。

"action" 子句可以包含多個語句,用花括號 ("{}") 括起來。

"while" 的語法為

   while (<condition>) <action>

只要 "condition" 測試為真, "action" 就執行,並且

"condition" 在每次迭代之前進行測試。 條件與 "if ... else" 結構中的條件相同。 例如,由於預設情況下 Awk 變數的值為 0,因此以下 Awk 程式可以列印從 1 到 20 的數字

  BEGIN {x=0; while(x<=20) {++x; print x}}
  • "for" 迴圈更靈活。 它的語法是
   for (<initial action>;<condition>;<end-of-loop action>) <action>

例如,以下 "for" 迴圈以 2 為增量列印數字 10 到 20

   BEGIN {for (i=10; i<=20; i+=2) print i}

這相當於

    i=10
    while (i<=20) {
        print i
        i+=2
    }

C 程式語言有類似的 "for" 結構,一個有趣的特性是,只需用逗號分隔操作,就可以在初始化和迴圈結束操作中執行多個操作。 不幸的是,大多數 Awk 實現不支援此功能。

"for" 迴圈有一個備用語法,用於掃描陣列

   for (<variable> in <array>) <action>

給定前面使用的示例

   my_string = "joe:frank:harry:bill:bob:sil";    split(my_string, names, ":");

—那麼可以使用以下語句列印名稱

   for (idx in names) print idx, names[idx];

這將產生

   2 frank
   3 harry
   4 bill
   5 bob
   6 sil
   1 joe

請注意,這些名稱沒有按正確順序列印。 這種 "for" 迴圈的一個特點是,陣列不是以可預測的順序掃描的。

無條件控制語句

[編輯 | 編輯原始碼]

Awk 定義了四個無條件控制語句:breakcontinuenextexit

語句 breakcontinue 嚴格地與 whilefor 迴圈相關聯

  • break: 導致跳出迴圈。
  • continue: 強制執行迴圈的下一輪迭代。

語句 nextexit 控制 Awk 的輸入掃描

  • next: 導致 Awk 立即獲取另一行輸入並從第一個匹配語句開始掃描。
  • exit: 導致 Awk 停止讀取其輸入,執行 END 操作(如果指定),然後結束。
華夏公益教科書