Awk

在 BEGIN 塊中設置 RS 時跳過 AWK 中的第一行

  • October 9, 2022

我有以下輸入文件:

-Queue ID-  --Size-- ----Arrival Time---- -Sender/Recipient-------
0F2F77F472  4343854 Fri Oct  7 10:13:41  email@example.com
(host redacted.host.com[x.x.x.x] said: 452 4.2.2 Over quota (in reply to end of DATA command))
                                        recipient@example.com

03A017F486   992790 Fri Oct  7 13:09:44  email@redacted.com
(host host.redacted.net[y.y.y.y] said: 452-4.2.2 The email account that you tried to reach is over quota. Please direct 452-4.2.2 the recipient to 452 4.2.2  redacted (in reply to RCPT TO command))
                                        redacted@example.net

在我的 AWK 腳本中,我寫瞭如下內容:

BEGIN {
 RS = "\n\n"
}

{
 ... do something ...
}

標頭也會得到處理,因此在我的管道中,在傳遞給 AWK 之前,我會:

... | tail +2 | awk -f script

我承認要跳過 AWK 中的第一行,主要是通過這個簡單的技巧:

{
 if (NR > 1) {
   ...
 }
}

它應該可以工作,但是RS = "\n\n"我在BEGIN塊中設置的會忽略第一條記錄(AWK 將標頭解釋為第一條記錄的一部分)。

測試:

$ awk 'BEGIN { RS = "\n\n" } { print NF }' sample
28
41

$ awk 'BEGIN { RS = "\n\n" } NR > 1 { print NF }' sample
41

有什麼方法可以在不依賴任何外部工具的情況下實現目標?


GNU Awk 5.0.1, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.2.0)

使用任何 awk:

$ awk 'NR==1{RS=""; next} {print NF}' file
22
38

當您使用RS = "\n\n"POSIX 未定義的行為時,您需要使用 GNU awk 或任何其他專門支持多字元 RS 的 awk(閱讀您的 awk 的手冊頁)。另一方面,如果您使用RS = ""POSIX 定義的 IS 將 awk 置於段落模式,其中每個記錄與下一個記錄由空行分隔。

在讀取第一行之前不設置 RS 可以讓我們輕鬆讀取和丟棄該行。

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