vastaus
Kuorimuuttuja on juuri seuraava: a kuori muuttuja . Jos haluat muuttaa sen awk -muuttujaksi, tarvitset syntaksin, kuten:
awk -v x="$x" "$2 == x {print $1}" infile
tai
awk "$2 == x {print $1}" x="$x" infile
Ne kärsivät kuitenkin ongelmasta: pakosarjoja laajennetaan niissä (ja GNU: n kanssa awk
4.2 tai uudempi, jos $x
alkaa @/
ja päättyy /
, sitä käsitellään muuttujan regexp-tyypinä ).
Joten esimerkiksi jos shell-muuttuja sisältää kaksi merkkiä käänteinen viiva ja n , awk-muuttuja lopulta sisältää newline -merkin (ja gawk 4.2+: n kanssa, jos se sisältää @/foo/
, awk-muuttuja sisältää foo
ja on tyyppiä regexp
).
Toinen lähestymistapa (mutta vaatii POSIX-awk: n tai nawk: n ( alkuperäisen awk: n sijaan, joka löytyy edelleen muutamasta parittomasta Unicesta)) on käyttää ympäristömuuttujia:
Toinen lähestymistapa (yhä uudemmilla awk-ohjelmilla) on käyttää ARGV-taulukkoa awk-tilassa:
awk "BEGIN {x = ARGV[1]; delete ARGV[1]} $2 == x {print $1}" "$x" infile
kommentit
vastaus
Et voi käyttää ulkoisia muuttujia kohdassa awk
suoraan, sinun on tuotava ne ensin awk
-muuttujina.
x=3 awk -v foo="$x" "$2=foo{print $1}" infile
ARGV
on itse asiassa POSIX-ominaisuus, se ' s määritelty juuri eri tavalla kohdissagawk
.ARGV
ettäENVIRON
ovat POSIX-tiedostoja, mutta eivät alkuperäisessä awk-tiedostossa, anteeksi, jos minulla ei ollut ' selvää siitä. Kuinka se eroaa kohdassagawk
?gawk
sisältää tunnistamattomat vaihtoehdot osioonARGV
, kun taas POSIXawk
ei ' t.-f
kuten kohdassaawk -f script.awk arg1 arg2...
jossa GNU awk ei ' t tarvitsee--
-merkinnän vaihtoehtojen lopun merkitsemiseksi, jos arg1 alkaa-
, mutta on ei kelvollinen vaihtoehto kyseisessä versiossaawk
. Mutta sillä ' ei ole merkitystä tässä asiassa, enkä todellakaan luottaisi siihen käyttäytymiseen (sisältäisin kuitenkin--
).