ekstern variabel i awk [duplikat]

Dette spørgsmål har allerede svar her :

Svar

En shellvariabel er netop det: en shell variabel . Hvis du vil gøre det til en awk variabel, har du brug for en syntaks som:

awk -v x="$x" "$2 == x {print $1}" infile 

eller

awk "$2 == x {print $1}" x="$x" infile 

De lider dog af et problem: escape-sekvenser udvides i dem (og med GNU awk 4.2 eller derover, hvis $x starter med @/ og slutter med /, det behandles som en regexp-type variabel ).

Så f.eks. hvis shellvariablen indeholder de to tegn tilbageslag og n , en awk-variabel vil ende med at indeholde newline -tegnet (og med gawk 4.2+, hvis den indeholder @/foo/, vil awk-variablen indeholde foo og være af typen regexp).

En anden tilgang (men som kræver en POSIX awk eller nawk ( i modsætning til den oprindelige awk som stadig findes på nogle få ulige enheder)) er at bruge miljøvariabler:

En anden tilgang (stadig med nyere awks) er at bruge ARGV-arrayet i awk:

awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile 

Kommentarer

  • Så vidt jeg ved, er ARGV faktisk en POSIX-funktion, det ' s bare defineret anderledes i gawk.
  • @ChrisDown Ja, både ARGV og ENVIRON er POSIX, men ikke i den originale awk, undskyld hvis jeg ikke var ' ikke klar over det. Hvordan er det anderledes i gawk?
  • gawk inkluderer ukendte muligheder i ARGV, mens POSIX awk ikke ' t.
  • @ChrisDown, jeg tror du ' henviser til det tilfælde, hvor awk kaldes med -f som i awk -f script.awk arg1 arg2... hvor GNU awk ikke ' t har brug for en -- for at markere slutningen af indstillingerne, hvis arg1 starter med en - ikke en gyldig mulighed i den bestemte version af awk. Men at ' ikke er relevant for denne sag, og jeg vil bestemt ikke stole på den adfærd (jeg vil alligevel inkludere --).

Svar

Du kan ikke bruge eksterne variabler i awk direkte skal du først importere dem som awk -variabler.

x=3 awk -v foo="$x" "$2=foo{print $1}" infile 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *