externe variabele in awk [duplicate]

Deze vraag heeft hier al antwoorden :

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

  • Voor zover ik weet, is ARGV eigenlijk een POSIX-functie, het is ' s zojuist anders gedefinieerd in gawk.
  • @ChrisDown Ja, beide ARGV en ENVIRON zijn POSIX maar niet in de originele awk, sorry als ik daar niet ' niet duidelijk over was. Hoe is het anders in gawk?
  • gawk bevat niet-herkende opties in ARGV, terwijl POSIX awk niet ' t.
  • @ChrisDown, ik denk dat je ' verwijzend naar het geval waarin awk wordt aangeroepen met -f zoals in awk -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 van awk. Maar dat ' is niet relevant voor deze kwestie, en ik zou zeker niet op dat gedrag vertrouwen (ik zou niettemin de -- toevoegen).

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 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *