Awk
在 BEGIN 塊中設置 RS 時跳過 AWK 中的第一行
我有以下輸入文件:
-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 可以讓我們輕鬆讀取和丟棄該行。