Mögliches Duplikat:
Verwenden Sie einen Skriptparameter in awk
Ich habe ein Skript, in dem sich ein Skript-Snippet befindet
x=3
awk '$2=$x{print $1}' infile
die externe Variable ist x,
aber es führt zu einem Fehler in awk
Wie kann man in dieser Situation awk erfolgreich ausführen?
danke!
Akzeptierte Antwort:
Eine Shell-Variable ist genau das:eine Shell Variable . Wenn Sie daraus ein awk machen möchten Variable benötigen Sie eine Syntax wie:
awk -v x="$x" '$2 == x {print $1}' infile
oder
awk '$2 == x {print $1}' x="$x" infile
Diese leiden jedoch unter einem Problem:Escape-Sequenzen werden in ihnen erweitert (und mit GNU awk
4.2 oder höher, wenn $x
beginnt mit @/
und endet mit /
, es wird als eine Regexp-Variable behandelt).
Also zB wenn die Shell-Variable die beiden Zeichen Backslash enthält und n , enthält die awk-Variable am Ende den Zeilenumbruch Zeichen (und mit gawk 4.2+, wenn es @/foo/
enthält , enthält die awk-Variable foo
und vom Typ regexp
sein ).
Ein anderer Ansatz (der aber ein POSIX-awk oder nawk erfordert (im Gegensatz zum ursprünglichen awk, das immer noch auf einigen ungeraden Unices zu finden ist)) ist die Verwendung von Umgebungsvariablen:
x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
Ein anderer Ansatz (immer noch mit neueren awks) ist die Verwendung des ARGV-Arrays in awk:
awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
$2 == x {print $1}' "$x" infile