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
ARGVtatsächlich eine POSIX-Funktion, ' s nur ingawkanders definiert. - @ChrisDown Ja, sowohl
ARGVals auchENVIRONsind POSIX, aber nicht im Original-Awk. Tut mir leid, wenn ich ' darüber nicht klar war. Wie unterscheidet es sich ingawk? -
gawkenthält nicht erkannte Optionen inARGV, während POSIXawknicht ' t. - @ChrisDown, ich denke, Sie ' bezieht sich auf den Fall, in dem awk mit
-faufgerufen 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