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"'
\b
awk 문자열에서 백슬래시는 백스페이스, \n
개행, 8진수 시퀀스 와 같은 C와 유사한 이스케이프 시퀀스를 도입하는 데 사용됩니다 . 백슬래시 자체가 \123
필요합니다 . 현재 이것은 \\
내가 알고 있는 \N
어떤 구현에서도 알려진 이스케이프 시퀀스가 아닙니다 .awk
일부 awk
구현은 다음과 "\N"
같이 처리 하고 일부는 으로 처리 하며 일부는 (gawk) 경고 메시지를 발행합니다. POSIX 지정되지 않은 동작.\
N
N
N
전달된 문자열에도 작동합니다. 예를 들면 다음과 같습니다.
awk -F'|' -v value='\\N' '$12 == value'
또는:
awk -F'|' '$12 == value' value='\\N'
특수 문자를 이스케이프 처리하는 것에 대해 걱정할 필요 없이 있는 그대로 값을 전달하기 위해 환경을 사용할 수 있습니다 awk
(그리고 awk
GNU 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
및 기타 쉘 제품군에서).