Awk

awk 中語句之間的分隔符

  • September 21, 2020

來自 Gawk 的手冊:

當一條規則中的 awk 語句很短時,您可能希望將多個語句放在一行中。這是通過用分號 (’;’) 分隔語句來實現的。這也適用於規則本身。因此,本節開頭顯示的程序也可以這樣編寫:

/12/ { print $0 } ; /21/ { print $0 }

注意:聲明同一行上的規則必須用分號分隔的要求在原始 awk 語言中沒有;添加它是為了與操作中的語句處理保持一致。

但我從https://stackoverflow.com/q/20262869/156458看到

awk '$2=="no"{$3="N/A"}1' file

不是$2=="no"{$3="N/A"}1兩個陳述嗎?為什麼他們不被任何東西分開?

謝謝。

非常好的問題!我認為關鍵是:“因此,本節開頭顯示的程序也可以這樣編寫:”

不是必須這樣寫。這是一種替代方式。這意味著(並且已經在實踐中證明)以下陳述都是正確的:

$ awk '/12/ { print $0 } /21/ { print $0 }' file
$ awk '/12/ { print $0 } ; /21/ { print $0 }' file

我認為這種分號用法是為了涵蓋非常短的慣用程式碼,例如我們省略了操作部分並且我們希望在同一行上應用多個規則的情況:

$ awk '/12//21/' file
awk: cmd. line:2: /12//21/
awk: cmd. line:2:         ^ unexpected newline or end of string

在這種情況下,必須使用分號來分隔規則(=條件):

$ awk '/12/;/21/' file

由於{action}在兩個規則/兩個條件中都省略了該部分,因此將為每個規則執行預設操作 ={print $0}

引用自:https://unix.stackexchange.com/questions/379103