다음과 같은 입력 파일이 있습니다.
-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를 설정하지 않으면 행을 쉽게 읽고 삭제할 수 있습니다.