OSX에서 awk를 사용하여 백슬래시를 이스케이프하세요.

OSX에서 awk를 사용하여 백슬래시를 이스케이프하세요.

csv 파일 필드에서 \N을 일치시키려고 합니다.

나는 노력했다

awk -F "|" '($12=="\N") {print}' ./filename.csv
awk -F "|" '($12==\N) {print}' ./filename.csv
awk -F "|" '($12==\\N) {print}' ./filename.csv
awk -F "|" '($12==\\\\N) {print}' ./filename.csv

지금까지 아무것도 작동하지 않습니다

답변1

Bourne과 같은 bash, Csh와 같은 또는 rc와 같은 셸에서는 다음을 사용합니다.

awk -F'|' '$12 == "\\N"'

\bawk 문자열에서 백슬래시는 백스페이스, \n개행, 8진수 시퀀스 와 같은 C와 유사한 이스케이프 시퀀스를 도입하는 데 사용됩니다 . 백슬래시 자체가 \123필요합니다 . 현재 이것은 \\내가 알고 있는 \N어떤 구현에서도 알려진 이스케이프 시퀀스가 ​​아닙니다 .awk

일부 awk구현은 다음과 "\N"같이 처리 하고 일부는 으로 처리 하며 일부는 (gawk) 경고 메시지를 발행합니다. POSIX 지정되지 않은 동작.\NNN

전달된 문자열에도 작동합니다. 예를 들면 다음과 같습니다.

awk -F'|' -v value='\\N' '$12 == value'

또는:

awk -F'|' '$12 == value' value='\\N'

특수 문자를 이스케이프 처리하는 것에 대해 걱정할 필요 없이 있는 그대로 값을 전달하기 위해 환경을 사용할 수 있습니다 awk(그리고 awkGNU 4.2 이상에서 발생하는 문제를 피하십시오.@/특수 문자로 시작하고 끝나는 값을 처리합니다 ./):

VALUE='\N' awk -F'|' '$12 == ENVIRON["VALUE"]'

또한 다음과 같은 정규식 리터럴에서도 작동합니다 /.../.

awk -F'|' '$12 ~ /\\N/'

그러나 백슬래시는 이스케이프 시퀀스 도입자(for \n, \b...) 및 정규식의 인용 연산자( \.또는 \$정규식 연산자로서의 특별한 의미를 제거하기 위한 ...)로 오버로드되므로 상황이 더욱 복잡해집니다. POSIX는 현재 on /\\./또는 off 와 같은 일부 특수한 경우에서 /\56/불분명합니다(어떤 경우에는 현실과 일치하지도 않음) /[\135]/. 재사용이 ENVIRON도움이 될 수 있지만 항상 그런 것은 아닙니다. 예를 들어:

R='[\]' awk '$0 ~ ENVIRON["R"]'

POSIX에서 백슬래시를 일치시키는 것을 목표로 하지만 awk내가 아는 모든 구현에서 오류를 반환합니다. 문자 그대로 받아들인다면, \안전을 위해 항상 내부 짝수를 피하는 것이 가장 좋습니다 .[...]

쉘 의 경우 for (대부분의 다른 쉘과 달리)는 작은따옴표 안에 특별하기 fish때문에 또 다른 이스케이프 레이어가 필요합니다 . 따라서 다음이 필요합니다.fish\

awk -F'|' '$12 == "\\\\N"'

거기. 하지만

awk -F'|' '$12 == "\\\N"'

작동할 것입니다.

env 'V=\N' awk -F'|' '$12 == ENVIRON["V"}'

또한 작동해야 합니다( fish및 기타 쉘 제품군에서).

관련 정보