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
ARGV
faktisk en POSIX-funktion, det ' s bare defineret anderledes igawk
.ARGV
ogENVIRON
er POSIX, men ikke i den originale awk, undskyld hvis jeg ikke var ' ikke klar over det. Hvordan er det anderledes igawk
?gawk
inkluderer ukendte muligheder iARGV
, mens POSIXawk
ikke ' t.-f
som 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--
).