필드 구분 기호 측면에서 gawk와 mawk의 차이점은 무엇입니까? 특히 여기서 무슨 일이 일어나고 있는지 알고 싶습니다.
모조품:
$ echo "100+50°20.5" | mawk -F '[+°.]' '{ print $1" - "$2" - "$3" - "$4" - "$5; }'
100 - 50 - - 20 - 5
멍청하게:
$ echo "100+50°20.5" | gawk -F '[+°.]' '{ print $1" - "$2" - "$3" - "$4" - "$5; }'
100 - 50 - 20 - 5 -
mawk가 어떻게든 추가 필드를 도입하는 것 같습니다. 올바른 행동이란 무엇입니까?
답변1
여기서 무슨 일이 일어나고 있는지 이해하려면 AWK에 입력으로 제공되는 바이트를 살펴보세요.
$ od -t x1 <<<"100+50°20.5"
0000000 31 30 30 2b 35 30 c2 b0 32 30 2e 35 0a
0000015
UTF-8에서 "°"는 0xC2 0xB0으로 표시되는 멀티바이트 문자입니다.MAWK는 멀티바이트 문자를 지원하지 않습니다.이므로 필드 구분 기호로 제공된 정규식을 4바이트 0x2B("+"), 0xC2("°"의 첫 번째 부분), 0xB0("°"의 두 번째 부분) 및 0x2E(" .")는 그 중 하나와 일치합니다. ). 입력 문자열에서 4번 일치하여 5개의 필드가 생성됩니다.
- "100"
- "50"
- 빈 문자열(0xC2와 0xB0 사이)
- "20"
- "5"
GAWK는 현재 로케일을 고려하고 기본적으로 멀티바이트 문자를 지원하므로 "°"를 문자로 일치시키고 4개의 필드를 찾습니다. 이 기능은 이 옵션을 사용하거나 -b
멀티바이트가 아닌 로케일로의 전환을 사용하여 비활성화할 수 있습니다 LC_ALL=C
.
답변2
StephenKitt가 주석에서 현명하게 설명했듯이 °
멀티바이트 문자는 컨텍스트에 따라 분할됩니다 [°]
.
이 문제를 해결하는 한 가지 방법은 "or" 정규식 연산자를 사용하는 것입니다.
awk -F '[+.]|°' ...