Svar
En skallvariabel er akkurat det: en skall variabel . Hvis du vil gjøre den om til en awk variabel, trenger du en syntaks som:
awk -v x="$x" "$2 == x {print $1}" infile
eller
awk "$2 == x {print $1}" x="$x" infile
De lider imidlertid av et problem: escape-sekvenser utvides i dem (og med GNU awk
4.2 eller høyere, hvis $x
starter med @/
og slutter med /
behandles den som en regexp-type variabel ).
Så for eksempel hvis skallvariabelen inneholder de to tegnene tilbakeslag og n vil awk-variabelen ende opp med newline -tegnet (og med gawk 4.2+, hvis den inneholder @/foo/
, vil awk-variabelen inneholder foo
og være av typen regexp
).
En annen tilnærming (men som krever en POSIX-awk eller nawk ( i motsetning til den opprinnelige awk som fremdeles finnes på noen merkelige enheter)) er å bruke miljøvariabler:
En annen tilnærming (fortsatt med nyere awks) er å bruke ARGV-arrayet i awk:
awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile
Kommentarer
Svar
Du kan ikke bruke eksterne variabler i awk
direkte, må du importere dem som awk
variabler først.
x=3 awk -v foo="$x" "$2=foo{print $1}" infile
ARGV
faktisk en POSIX-funksjon, den ' s bare definert annerledes igawk
.ARGV
ogENVIRON
er POSIX, men ikke i originalen, beklager hvis jeg ikke var ' ikke klar over det. Hvordan er det annerledes igawk
?gawk
inkluderer ukjente valg iARGV
, mens POSIXawk
ikke ' t.-f
som iawk -f script.awk arg1 arg2...
der GNU awk ikke ' t trenger en--
for å markere slutten på alternativene hvis arg1 starter med en-
ikke et gyldig alternativ i den bestemte versjonen avawk
. Men at ' ikke er relevant for denne saken, og jeg vil definitivt ikke stole på den oppførselen (jeg vil inkludere--
likevel).