awk でフィールド区切り文字として ' (' (スペースの後に括弧) を使用する

awk でフィールド区切り文字として ' (' (スペースの後に括弧) を使用する

スクリプトでは、awkフィールド区切り文字として「(」を使用しようとしています。ただし、次のように二重のバックスラッシュで括弧をエスケープしないと、

BEGIN {FS=" \\("}

それは動作しません。

使うFS=" \("

awk: prog:2: warning: escape sequence `\(' treated as plain `('
awk: prog:2: fatal: :, [., or [=: / (/

出力で括弧を全くエスケープしない場合は、

awk: prog:2: fatal: :, [., or [=: / (/メッセージ。

この動作について説明していただけますか?

答え1

␣(でフィールド区切り文字として (スペース + 括弧)を使用するにはawk、次のようにします"␣\\\("

$ echo "a (b (c" | awk -F " \\\(" '{ print $1; print $2; print $3 }'
a
b
c

あるいは、一重引用符と 2 つのバックスラッシュを使用します。

$ echo "a (b (c" | awk -F ' \\(' '{ print $1; print $2; print $3 }'
a
b
c

その理由は␣((括弧が1つだけ先頭にスペースがある文字列は不正な正規表現です。左括弧は閉じられないグループ化を開始します。このため、エスケープする必要があります。

((括弧が1つだけそれなしFSが 1 文字の場合、正規表現として扱われないという点が異なります (先頭のスペースが 1 つだけの場合) 。

答え2

同様の問題 ( awk のフィールド区切りとしてORを使用する) の解決策を探しているときに、このスレッドを見つけました(。これでは完全には解決しませんでしたが、私の解決策を紹介します。

awk でファイルを分離するために組み合わせを␣(単一の単位として扱いたい場合は、次のようにしますawk -F '( \\()' ...

$ echo "This (maybe) is a test()" | awk -F '( \\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This
maybe) is a test()





Number of Fields: 2

私と同様の問題の解決策を探している場合は、または(次の操作を実行してくださいawk -F '( |\\()' ...

$ echo "This (maybe) is a test()" | awk -F '( |\\()' '{print $1 "\n" $2 "\n" $3 "\n" $4 "\n" $5 "\n" $6 "\n" $7; print "Number of Fields: " NF}'
This

maybe)
is
a
test
)
Number of Fields: 7

関連情報