저는 GNU Awk 사용자 가이드를 살펴 보았고 표준 awk를 사용한 4.1.1 레코드 분할 섹션 에서 이것을 발견했습니다 .
레코드 구분자로 일반 문자를 사용할 때 gawk가 완전히 POSIX를 준수 할 때 발생하는 특이한 경우가 있습니다 ( 명령 줄 옵션 섹션 참조 ). 그런 다음 다음 (극단적 인) 파이프 라인이 놀라운 '1'을 인쇄합니다.
$ echo | gawk --posix 'BEGIN { RS = "a" } ; { print NF }' -| 1
개행으로 구성된 하나의 필드가 있습니다. 내장 변수 NF의 값은 현재 레코드의 필드 수입니다. (일반적인 경우 gawk는 개행 문자를 공백으로 처리하여 결과로 '0'을 인쇄합니다. 대부분의 다른 버전의 awk도이 방식으로 작동합니다.)
확인했지만 GNU Awk 5.0.0에서 작동하지 않습니다.
$ gawk --version
GNU Awk 5.0.0, API: 2.0 (GNU MPFR 4.0.2, GNU MP 6.1.2)
$ echo | gawk --posix 'BEGIN { RS = "a" } ; { print NF }'
0
즉, 동작은 POSIX 모드가없는 경우와 정확히 동일합니다.
$ echo | gawk 'BEGIN { RS = "a" } ; { print NF }'
0
레코드 구분자가 기본값이 아닌 경우 (즉, 새 줄이 아닌 경우) 새 줄의 내용 만 필드로 간주된다는 점을 이해합니다. 그러나 재현 할 수 없습니다.
예제를 어떻게 재현해야합니까? 나도 gawk --traditional
또는 시도 gawk -P
했지만 결과는 항상 0이었습니다.
내가 확인한 GNU Awk 사용자 가이드는 5.1 버전이고 5.0.0이 있으므로 5.0.0에 대한 보관 버전 도 확인 했는데 동일한 행이 표시되므로 5.0과 5.1 사이에서 변경된 것이 아닙니다. .
POSIX 표준을 읽을 때 다음을 찾습니다.
awk 유틸리티는 기본적으로 필드가 <공백>이 아닌 <줄 바꿈> 문자가 아닌 문자열 인 필드 시퀀스로 각 입력 레코드를 해석합니다. 이 기본 <blank> 및 <newline> 필드 구분 기호는
FS
기본 제공 변수를 사용하여 변경할 수 있습니다.
FS
<space> 인 경우 선행 및 후행 <blank> 및 <newline> 문자를 건너 뜁니다 . 필드는 하나 이상의 <blank> 또는 <newline> 문자 세트로 구분됩니다.
즉, 올바른 동작은 다음과 같아야합니다.
$ echo | awk 'BEGIN{RS="a"}{print NR,NF,length}'
1 0 1
FS
기본 공백이므로 모든 선행 및 후행 <blank> 및 <newline> 문자; 건너 뜁니다를 정의 할 때 FS
이야기는 완전히 다릅니다.
$ echo | awk 'BEGIN{FS="b";RS="a"}{print NR,NF,length}'
1 1 1
$ echo | awk 'BEGIN{FS="\n";RS="a"}{print NR,NF,length}'
1 2 1
결론 : GNU awk 문서가 잘못되었다고 생각합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다