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
ARGVje ve skutečnosti funkce POSIX, je to ' s právě definováno odlišně vgawk.ARGVaENVIRONjsou POSIX, ale ne v původním awk, omlouvám se, pokud mi to nebylo ' jasné. Jak se liší vgawk?gawkzahrnutí nerozpoznaných možností doARGV, zatímco POSIXawknení ' t.-fjako 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--).