나는 Gawk 매뉴얼에서 다음을 읽었습니다.
GNU 확장
[...]
FS의 값으로 빈 문자열을 사용하고 Split()에 대한 세 번째 인수를 사용하여 단일 문자를 분할하는 기능입니다.
그러나 이것은 사실이 아닌 것 같습니다. 이는 예상대로 작동합니다.
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
다른 확장 프로그램을 비활성화할 수 있습니다.
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {typeof(1)}'
gawk: cmd. line:1: fatal: function `typeof' not defined
하지만 분할 동작을 비활성화할 수는 없습니다.
$ export POSIXLY_CORRECT
$ gawk 'BEGIN {print split("quebec", z, "")}'
6
$ gawk --posix 'BEGIN {print split("quebec", z, "")}'
6
나는 또한 Mawk 매뉴얼을 보았다:
FS = ""인 경우, mawk는 레코드를 개별 문자로 나누고, 마찬가지로 Split(s,A,"")는 s의 개별 문자를 A에 넣습니다.
[...]
Posix는 명시적으로 FS = ""의 동작을 정의되지 않은 상태로 두고 가능한 설명으로 레코드를 문자로 분할하는 것을 언급하지만 이 사용법은 현재 구현 간에 이식 가능하지 않습니다.
FS
그렇다면 및 를 사용하여 단일 문자를 가져오는 데 사용할 수 없는 구현은 무엇입니까 split
?
답변1
POSIX는 해당 동작을 유지하기 때문에 POSIX 스크립트에서 사용할 수 없기 때문에 POSIX가 아닙니다.명시되지 않은. 즉, 애플리케이션(스크립트)은 이식성을 원할 경우 사용할 수 없지만 구현(구현 awk
)은 원하는 대로 무엇이든 할 수 있습니다. 단, POSIX를 사용하는 한은 그렇게 해야 합니다. POSIX는 문자나 바이트로 분할하거나 오류를 보고하거나 컴퓨터를 다시 시작할 필요가 없으며 awk
지정하지 않습니다.
따라서 gawk
환경에 있을 때 이와 관련하여 동작을 변경할 이유가 없으며, $POSIXLY_CORRECT
이 경우 다른 동작보다 POSIX가 더 올바른 동작은 없습니다.
발견한 대로 이 확장은 gawk(1996년 1월 버전 3.0 기준) 및 mawk(1996년 1월 버전 1.2 기준)에 존재합니다. 이는 또한 비지박스 awk
(처음부터(2002)부터) 에 있고 1996년 5월부터 Brian Kernighan이 관리하는 ( k
in )에도 있습니다(이 문서에서는awk
FIXES
gawk
, 등.영감으로). 몇 달 안에 3개 모두에 추가된 것으로 보이며, 이는 관리자가 이에 대해 논의했을 수 있음을 시사합니다. 지금은 누가 먼저 아이디어를 냈는지 잘 모르겠습니다.
Brian Kernighan awk
또는 이에 기반한 것(FreeBSD 또는 OpenBSD 등)의 경우, FS
비어 있거나 비어 있는 세 번째 인수를 전달하면 split()
문자열이 개별 문자로 분할된다는 점에 유의하십시오(글쎄,바이트, 아래 참조), awk -F ''
오류를 반환합니다( awk -v FS=
하지만 괜찮습니다).
Solaris에서 nawk
및 /usr/xpg4/bin/awk
(및 /bin/awk
70년대 이전 버전)의 경우 null은 FS
분할을 완전히 비활성화하는 것 같습니다. nawk -F ''
오류를 반환합니다. AIX나 HP/UX와 같은 AT&T 코드를 기반으로 하는 다른 상업용 Unices에서도 동일하게 작동하기를 바랍니다. 비록 그곳에서 테스트할 수는 없지만요.
또한 mawk
bwk에 유의하세요 awk
(일부 사람들에게는 이것이 다릅니다).기반으로위) 및 busybox awk는 멀티바이트 문자를 지원하지 않습니다. 예를 들어 UTF-8에서는 다음과 같습니다.
echo Stéphane | awk -v FS= '{print $4}'
내 이름의 세 번째 문자의 후반부를 인쇄합니다. 따라서 이들에 대해서는 빈 FS가 문자보다는 개별 바이트로 분할된다고 말하는 것이 더 정확합니다.
1 이제 POSIXLY_CORRECT 또는 를 사용하면 POSIX와 충돌하지 않는 일부 확장이 비활성화된다는 것을 깨달았습니다( --posix
실제로 는 호환되지 않지만). 따라서 이것이 누락이라고 말할 수 있습니다. 이제 이것이 처음이 아닙니다. 예를 들어 POSIX와 충돌하더라도( 변수에 1을 할당하지만 POSIXLY_CORRECT에서도 오류를 보고한다는 의미) 비활성화되지 않습니다.gawk
typeof
gawk
nextfile
awk '{nextfile = 1}'
nextfile
gawk