我正在尝试匹配 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 的 shell 中,使用:
awk -F'|' '$12 == "\\N"'
在 awk 字符串中,反斜杠用于引入类似 C 的转义序列,例如\b
退格键、\n
换行符、\123
八进制序列……您需要\\
反斜杠本身。目前,在我所知道的\N
任何实现中,其本身都不是已知的转义序列。awk
有些awk
实现会将"\N"
as视为\
和N
,有些作为N
,有些 (gawk) likeN
并发出警告消息。 POSIX 未指定行为。
请注意,它也适用于传递的字符串,例如:
awk -F'|' -v value='\\N' '$12 == value'
或者:
awk -F'|' '$12 == value' value='\\N'
您可能希望使用环境按原样传递值,而不必担心转义特殊字符awk
( 并避免 GNU awk
4.2 或更高版本的问题,这处理以特殊开头@/
和结尾的值/
):
VALUE='\N' awk -F'|' '$12 == ENVIRON["VALUE"]'
它也适用于正则表达式文字,如下/.../
所示:
awk -F'|' '$12 ~ /\\N/'
然而,由于反斜杠作为转义序列引入符(for \n
, \b
...)和正则表达式的引用运算符(\.
或\$
... 以删除其正则表达式运算符的特殊含义)而被重载,因此情况变得更加复杂。 POSIX 目前在一些极端情况下(例如 on/\\./
或/\56/
)尚不清楚(甚至在某些情况下与现实不符)/[\135]/
。再次使用ENVIRON
会有所帮助,但并不总是如此。例如:
R='[\]' awk '$0 ~ ENVIRON["R"]'
旨在匹配 POSIX 中的反斜杠,但awk
在我知道的所有实现中返回错误。如果从字面上理解的话,为了安全起见,最好总是逃避\
内部的偶数。[...]
请注意,对于fish
shell,您需要另一层转义,因为 for fish
(与大多数其他 shell 相反)\
在单引号内是特殊的。所以你需要:
awk -F'|' '$12 == "\\\\N"'
那里。尽管
awk -F'|' '$12 == "\\\N"'
也会起作用。
env 'V=\N' awk -F'|' '$12 == ENVIRON["V"}'
也应该工作(在fish
和其他 shell 系列中)。