次の入力ファイルがあります。
-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を設定しないと、行を簡単に読み取って削除できます。