Odpověď
Proměnná prostředí je právě tato: a shell proměnná . Chcete-li ji proměnit na proměnnou awk , potřebujete syntaxi, například:
awk -v x="$x" "$2 == x {print $1}" infile
nebo
awk "$2 == x {print $1}" x="$x" infile
Ti však trpí problémem: jsou v nich rozšířeny únikové sekvence (a s GNU awk
4.2 nebo vyšší, pokud $x
začíná @/
a končí /
, je to považováno za typ proměnné regulárního výrazu ).
Takže například pokud proměnná prostředí obsahuje dva znaky zpětné lomítko a n , proměnná awk skončí obsahující znak nový řádek (a s gawk 4.2+, pokud obsahuje @/foo/
, proměnná awk bude obsahovat foo
a být typu regexp
).
Jiný přístup (který však vyžaduje POSIX awk nebo nawk ( na rozdíl od původního awku, který se stále nachází v několika lichých Unices)), je použití proměnných prostředí:
Dalším přístupem (stále s novějšími awks) je použití pole ARGV v awk:
awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile
Komentáře
Odpověď
V awk
přímo, musíte je nejprve importovat jako awk
proměnné.
x=3 awk -v foo="$x" "$2=foo{print $1}" infile
ARGV
je ve skutečnosti funkce POSIX, je to ' s právě definováno odlišně vgawk
.ARGV
aENVIRON
jsou POSIX, ale ne v původním awk, omlouvám se, pokud mi to nebylo ' jasné. Jak se liší vgawk
?gawk
zahrnutí nerozpoznaných možností doARGV
, zatímco POSIXawk
není ' t.-f
jako vawk -f script.awk arg1 arg2...
kde GNU awk doesn ' není třeba--
označit konec možností, pokud arg1 začíná-
, ale je není platná volba v konkrétní verziawk
. To ale ' pro tuto věc není relevantní, a rozhodně bych se na toto chování nespoléhal (přesto bych zahrnoval--
).