BEGINブロックにRSを設定するときは、AWKの最初の行をスキップしてください。

BEGINブロックにRSを設定するときは、AWKの最初の行をスキップしてください。

次の入力ファイルがあります。

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

03A017F486   992790 Fri Oct  7 13:09:44  [email protected]
(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))
                                         [email protected]

私の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)

ベストアンサー1

awkを使用してください。

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

POSIX未定義の動作を使用する場合は、RS = "\n\n"GNU awkまたは特にマルチキャラクタRSをサポートする他のawkを使用する必要があります(awkのマニュアルページを読む)。一方、RS = ""POSIX 定義 IS を使用している場合は、awk をショートモードに切り替えます。ここで、各レコードは空行で次のレコードと区別されます。

最初の行を読み取る前にRSを設定しないと、行を簡単に読み取って削除できます。

おすすめ記事