Válasz
A héjváltozó éppen ilyen: a shell változó . Ha azt szeretné, hogy awk változóvá váljon, akkor szüksége van egy szintaxisra, például:
awk -v x="$x" "$2 == x {print $1}" infile
vagy
awk "$2 == x {print $1}" x="$x" infile
Azok azonban problémát szenvednek: a menekülési szekvenciák kibővülnek bennük (és a GNU awk
4.2 vagy újabb verzióival ha $x
@/
-vel kezdődik és /
, a regexp változótípusként kezeljük ).
Tehát például, ha a shell változó a két karaktert visszavágó és tartalmazza n az awk változó végül az newline karaktert fogja tartalmazni (és a gawk 4.2+ verzióval, ha @/foo/
-t tartalmaz, akkor az awk változó tartalmazza a foo
-t, és regexp
típusú legyen.
Másik megközelítés (de ehhez POSIX awk vagy nawk szükséges ( ellentétben az eredeti awk-val, amely még mindig megtalálható néhány páratlan Unicel)) környezeti változók használata: 79110249a “>
Egy másik megközelítés (még mindig újabb awk-kkel) az ARGV tömb használata awk-ban:
awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile
Megjegyzések
Válasz
Külső változókat nem használhat a awk
közvetlenül, először awk
változóként kell importálni őket.
x=3 awk -v foo="$x" "$2=foo{print $1}" infile
ARGV
valójában POSIX szolgáltatás, ' s csak másképp definiálva itt:gawk
.ARGV
, mind aENVIRON
vannak POSIX-osok, de nincsenek az eredeti awk-ban, sajnálom, ha nem voltam ' tisztában ezzel. Miben különbözik agawk
fájlban?gawk
ismeretlen opciókat tartalmaz aARGV
, míg a POSIXawk
nem ' t.-f
-vel hívják, mint aawk -f script.awk arg1 arg2...
-ben, ahol a GNU awk nem ' nem kell egy--
az opciók végének megjelöléséhez, ha az arg1-
-vel kezdődik nem érvényes beállítás aawk
adott verziójában. De ez ' nem releváns ebben az ügyben, és én biztosan nem támaszkodnék erre a viselkedésre (ennek ellenére a--
-et is beletenném).