Svar
En skalvariabel är just det: en skal variabel . Om du vill förvandla den till en awk -variabel behöver du en syntax som:
awk -v x="$x" "$2 == x {print $1}" infile
eller
awk "$2 == x {print $1}" x="$x" infile
De lider emellertid av ett problem: escape-sekvenser utökas i dem (och med GNU awk
4.2 eller högre, om $x
börjar med @/
och slutar med /
behandlas den som en regexp-typ av variabel ).
Så, till exempel om skalvariabeln innehåller de två tecknen backslash och n kommer awk-variabeln att innehålla newline karaktär (och med gawk 4.2+, om den innehåller @/foo/
, kommer awk-variabeln att innehålla foo
och vara av typen regexp
).
Ett annat tillvägagångssätt (men som kräver en POSIX-awk eller nawk ( i motsats till den ursprungliga awk som fortfarande finns på några udda enheter)) är att använda miljövariabler:
Ett annat tillvägagångssätt (fortfarande med nyare awks) är att använda ARGV-arrayen i awk:
awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile
Kommentarer
Svar
Du kan inte använda externa variabler i awk
direkt måste du importera dem som awk
variabler först.
x=3 awk -v foo="$x" "$2=foo{print $1}" infile
ARGV
faktiskt en POSIX-funktion, den ' s precis definierat annorlunda igawk
.ARGV
ochENVIRON
är POSIX men inte i originalfunktionen, förlåt om jag inte ' inte klarade det. Hur är det annorlunda igawk
?gawk
innehåller okända alternativ iARGV
, medan POSIXawk
inte ' t.-f
som iawk -f script.awk arg1 arg2...
där GNU awk inte ' t behöver en--
för att markera slutet på alternativen om arg1 börjar med en-
inte ett giltigt alternativ i den specifika versionen avawk
. Men att ' inte är relevant för denna fråga, och jag skulle definitivt inte förlita mig på det beteendet (jag skulle ändå inkludera--
).