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
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
ARGVfaktisk en POSIX-funktion, det ' s bare defineret anderledes igawk.ARGVogENVIRONer POSIX, men ikke i den originale awk, undskyld hvis jeg ikke var ' ikke klar over det. Hvordan er det anderledes igawk?gawkinkluderer ukendte muligheder iARGV, mens POSIXawkikke ' t.-fsom iawk -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 afawk. Men at ' ikke er relevant for denne sag, og jeg vil bestemt ikke stole på den adfærd (jeg vil alligevel inkludere--).