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
および他のシェルファミリで)。