RS를 다른 것으로 설정할 때 GNU Awk의 POSIX 모드가 새 줄을 필드로 간주하지 않는 이유는 무엇입니까?

페 도르 키 'SO stop harming'

저는 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 사이에서 변경된 것이 아닙니다. .

kvantour

POSIX 표준을 읽을 때 다음을 찾습니다.

awk 유틸리티는 기본적으로 필드가 <공백>이 아닌 <줄 바꿈> 문자가 아닌 문자열 인 필드 시퀀스로 각 입력 레코드를 해석합니다. 이 기본 <blank> 및 <newline> 필드 구분 기호는 FS기본 제공 변수를 사용하여 변경할 수 있습니다.

FS<space> 인 경우 선행 및 후행 <blank> 및 <newline> 문자를 건너 뜁니다 . 필드는 하나 이상의 <blank> 또는 <newline> 문자 세트로 구분됩니다.

출처 : POSIX awk 표준 : IEEE Std 1003.1-2017

즉, 올바른 동작은 다음과 같아야합니다.

$ echo | awk 'BEGIN{RS="a"}{print NR,NF,length}'
1 0 1
  • 단일 레코드 : <a>-문자가 없습니다.
  • 필드 없음 : FS기본 공백이므로 모든 선행 및 후행 <blank> 및 <newline> 문자; 건너 뜁니다
  • 길이 1 : 레코드에 단일 문자 만 있습니다.

를 정의 할 때 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] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관