Antwort
Eine Shell-Variable ist genau das: eine Shell Variable . Wenn Sie daraus eine awk -Variable machen möchten, 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
mit @/
beginnt und mit /
wird als regexp-Variablentyp behandelt ).
Wenn die Shell-Variable beispielsweise die beiden Zeichen backslash und enthält n enthält die awk-Variable am Ende das Zeichen newline (und bei gawk 4.2+, wenn sie @/foo/
enthält, enthält die awk-Variable Enthält foo
und ist vom Typ regexp
).
Ein anderer Ansatz (der jedoch ein POSIX awk oder nawk erfordert ( im Gegensatz zum ursprünglichen awk, wie es immer noch auf einigen ungeraden Unices zu finden ist)) werden Umgebungsvariablen verwendet:
Ein anderer Ansatz (immer noch mit neueren awks) besteht darin, das ARGV-Array in awk zu verwenden:
awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile
Kommentare
- Soweit ich weiß, ist
ARGV
tatsächlich eine POSIX-Funktion, ' s nur ingawk
anders definiert. - @ChrisDown Ja, sowohl
ARGV
als auchENVIRON
sind POSIX, aber nicht im Original-Awk. Tut mir leid, wenn ich ' darüber nicht klar war. Wie unterscheidet es sich ingawk
? -
gawk
enthält nicht erkannte Optionen inARGV
, während POSIXawk
nicht ' t. - @ChrisDown, ich denke, Sie ' bezieht sich auf den Fall, in dem awk mit
-f
aufgerufen wird, wie inawk -f script.awk arg1 arg2...
, wo GNU awk nicht ' benötigt kein--
, um das Ende der Optionen zu markieren, wenn arg1 mit einem-
beginnt, dies aber ist Keine gültige Option in dieser bestimmten Version vonawk
. Aber das ' ist für diese Angelegenheit nicht relevant, und ich würde mich definitiv nicht auf dieses Verhalten verlassen (ich würde trotzdem das--
einschließen).
Antwort
In awk
direkt müssen Sie sie zuerst als awk
-Variablen importieren.
x=3 awk -v foo="$x" "$2=foo{print $1}" infile