有兩種透過命令列設定 awk 變數的方法嗎?

有兩種透過命令列設定 awk 變數的方法嗎?

我注意到一個 O'Reillyawk範例(1997),它透過在命令列上設定 awk 變數來分配它程式文本。它確實有效,但我找不到這個語法人/資訊 awk。我剛剛錯過了嗎?是不是已經貶值了...?我在手冊中看到的唯一語法是-v選項。

awk '/home/{print foo, bar}' foo="cat" bar="dog" /proc/$$/cmdline

輸出:cat dog

答案1

它實際上是在 POSIX 中awk(連結到 POSIX 2008,我相信以前的版本也有它)。-v描述於選項部分,另一種方式是在操作數部分。

-v最後透過檔案名稱傳遞賦值是有差別的:

  • -v

應用程式應確保賦值參數與賦值運算元的形式相同。指定的變數賦值應發生在執行 awk 程序之前,包括與 BEGIN 模式相關的操作(如果有的話)。可以指定此選項多次出現。

  • 與檔案名稱混合:

[...]每個這樣的變數賦值都應發生在處理以下文件之前,如果有的話。因此,第一個檔案參數之前的賦值應在 BEGIN 操作(如果有)之後執行,而最後一個檔案參數之後的賦值應在 END 操作(如果有)之前執行。如果沒有檔案參數,則應在處理標準輸入之前執行賦值。

例子:

$ cat input 
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
    var=two input var=three input var=four
one
two
two
three
three
four

答案2

這是在外部設定變數的舊風格awk。它是不明確的(如果你有一個名為 的檔案名稱怎麼辦foo=cat),所以後來的版本添加了一個-v選項。它可能應該適用於向後相容,但你不能保證。正如我所說,該-v選項較新,因此並非所有版本awk都支援它。

相關內容