Antwoord
Een shell-variabele is precies dat: een shell variabele . Als je er een awk variabele van wilt maken, heb je een syntaxis nodig zoals:
awk -v x="$x" "$2 == x {print $1}" infile
of
awk "$2 == x {print $1}" x="$x" infile
Die hebben echter een probleem: escape-reeksen worden erin uitgebreid (en met GNU awk
4.2 of hoger, als $x
begint met @/
en eindigt op /
, het wordt behandeld als een regexp-type variabele ).
Dus bijvoorbeeld als de shell-variabele de twee karakters backslash en n , zal de awk-variabele uiteindelijk het newline -teken bevatten (en met gawk 4.2+, als het @/foo/
bevat, zal de awk-variabele bevatten foo
en zijn van het type regexp
).
Een andere benadering (maar die een POSIX awk of nawk ( in tegenstelling tot de originele awk die nog steeds op een paar oneven Unices wordt aangetroffen)), is het gebruik van omgevingsvariabelen:
Een andere benadering (nog met nieuwere awks) is om de ARGV-array in awk te gebruiken:
awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile
Reacties
Antwoord
U kunt “geen externe variabelen gebruiken in awk
rechtstreeks, moet u ze eerst importeren als awk
variabelen.
x=3 awk -v foo="$x" "$2=foo{print $1}" infile
ARGV
eigenlijk een POSIX-functie, het is ' s zojuist anders gedefinieerd ingawk
.ARGV
enENVIRON
zijn POSIX maar niet in de originele awk, sorry als ik daar niet ' niet duidelijk over was. Hoe is het anders ingawk
?gawk
bevat niet-herkende opties inARGV
, terwijl POSIXawk
niet ' t.-f
zoals inawk -f script.awk arg1 arg2...
waar GNU awk niet '--
is niet nodig om het einde van opties aan te geven als arg1 begint met een-
maar is geen geldige optie in die specifieke versie vanawk
. Maar dat ' is niet relevant voor deze kwestie, en ik zou zeker niet op dat gedrag vertrouwen (ik zou niettemin de--
toevoegen).