Verwenden von '(' (Leerzeichen gefolgt von Klammern) als Feldtrennzeichen in awk

Verwenden von '(' (Leerzeichen gefolgt von Klammern) als Feldtrennzeichen in awk

Ich versuche in einem awkSkript, '(' als Feldtrennzeichen zu verwenden. Es sei denn, ich verbinde die Klammer mit einem doppelten Backslash, wie folgt:

BEGIN {FS=" \\("}

es funktioniert nicht.

Wenn ich benutze, FS=" \("bekomme ich

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

Ausgabe und wenn ich die Klammer überhaupt nicht verlasse, bekomme ich nur die

awk: prog:2: fatal: :, [., or [=: / (/Nachricht.

Können Sie dieses Verhalten bitte erklären?

Antwort1

␣(Um (Leerzeichen+Klammern) als Feldtrennzeichen in zu verwenden awk, verwenden Sie "␣\\\(":

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

Alternativ können Sie einfache Anführungszeichen und zwei Backslashes verwenden:

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

Der Grund hierfür ist, dass ␣((eine einzelne Klammermitein führendes Leerzeichen) ist ein fehlerhafter regulärer Ausdruck. Die linke Klammer öffnet eine Gruppierung, die nie geschlossen wird. Aus diesem Grund muss sie maskiert werden.

Der Grund dafür ((eine einzelne Klammerohneein führendes Leerzeichen) funktioniert, besteht darin, dass FSes nicht als regulärer Ausdruck behandelt wird, wenn es sich um ein einzelnes Zeichen handelt.

Antwort2

Ich bin auf diesen Thread gestoßen, als ich nach einer Lösung für ein ähnliches Problem gesucht habe – die Verwendung von OR (als Feldtrennzeichen für awk. Dies war zwar keine vollständige Antwort, aber hier ist meine Lösung:

Wenn Sie die Kombination ␣(als einzelne Einheit zum Trennen von Dateien in AWK wünschen, gehen Sie wie folgt vor 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

Wenn Sie nach einer Lösung für mein ähnliches Problem suchen, tun Sie entweder ODER :(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

verwandte Informationen