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

関連情報