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
ARGVeigenlijk een POSIX-functie, het is ' s zojuist anders gedefinieerd ingawk.ARGVenENVIRONzijn POSIX maar niet in de originele awk, sorry als ik daar niet ' niet duidelijk over was. Hoe is het anders ingawk?gawkbevat niet-herkende opties inARGV, terwijl POSIXawkniet ' t.-fzoals 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).