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를 설정하지 않으면 행을 쉽게 읽고 삭제할 수 있습니다.

관련 정보