awk에서 '('(공백 뒤에 괄호)를 필드 구분 기호로 사용

awk에서 '('(공백 뒤에 괄호)를 필드 구분 기호로 사용

스크립트 에서 awk'('를 필드 구분 기호로 사용하려고 합니다. 그러나 다음과 같이 이중 백슬래시를 사용하여 대괄호를 이스케이프 처리하지 않는 한:

BEGIN {FS=" \\("}

작동하지 않습니다.

내가 사용하면 FS=" \("나는 얻는다.

awk: prog:2: warning: escape sequence `\(' treated as plain `('
awk: prog:2: fatal: :, [., or [=: / (/

출력하고 대괄호를 전혀 이스케이프 처리하지 않으면 다음과 같은 결과를 얻습니다.

awk: prog:2: fatal: :, [., or [=: / (/메시지.

이 행동을 설명해 주시겠습니까?

답변1

␣(에서 필드 구분 기호로 (공백+괄호)를 사용하려면 awk다음을 사용하세요 "␣\\\(".

$ echo "a (b (c" | awk -F " \\\(" '{ print $1; print $2; print $3 }'
a
b
c

또는 작은따옴표와 두 개의 백슬래시를 사용합니다.

$ echo "a (b (c" | awk -F ' \\(' '{ print $1; print $2; print $3 }'
a
b
c

그 이유는 ␣((단일 괄호~와 함께선행 공백)은 잘못된 정규 표현식입니다. 왼쪽 괄호는 닫히지 않는 그룹을 엽니다. 이것이 이스케이프되어야 하는 이유입니다.

그 이유는 ((단일 괄호없이선행 공백)이 작동하는 이유는 FS단일 문자일 때 정규식으로 처리되지 않는다는 것입니다.

답변2

비슷한 문제에 대한 해결책을 검색할 때 이 스레드를 찾았습니다. OR을 (awk의 필드 구분 기호로 사용합니다. 이것은 대답이 아니지만 내 솔루션을 알려 드리겠습니다.

␣(awk에서 파일을 분리하기 위해 단일 단위로 조합하려면 다음을 수행하십시오 awk -F '( \\()' ....

$ echo "This (maybe) is a test()" | awk -F '( \\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe) is a test()





Number of Fields: 2

비슷한 문제에 대한 해결책을 찾고 있다면 - OR 중 하나를 (수행하십시오 awk -F '( |\\()' ....

$ echo "This (maybe) is a test()" | awk -F '( |\\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This

maybe)
is
a
test
)
Number of Fields: 7

관련 정보