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
ARGVon itse asiassa POSIX-ominaisuus, se ' s määritelty juuri eri tavalla kohdissagawk.ARGVettäENVIRONovat POSIX-tiedostoja, mutta eivät alkuperäisessä awk-tiedostossa, anteeksi, jos minulla ei ollut ' selvää siitä. Kuinka se eroaa kohdassagawk?gawksisältää tunnistamattomat vaihtoehdot osioonARGV, kun taas POSIXawkei ' t.-fkuten 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--).