ulkoinen muuttuja awk: ssä [duplikaatti]

Tähän kysymykseen on jo annettu vastauksia :

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

  • Sikäli kuin tiedän, ARGV on itse asiassa POSIX-ominaisuus, se ' s määritelty juuri eri tavalla kohdissa gawk.
  • @ChrisDown Kyllä, sekä ARGV että ENVIRON ovat POSIX-tiedostoja, mutta eivät alkuperäisessä awk-tiedostossa, anteeksi, jos minulla ei ollut ' selvää siitä. Kuinka se eroaa kohdassa gawk?
  • gawk sisältää tunnistamattomat vaihtoehdot osioon ARGV, kun taas POSIX awk ei ' t.
  • @ChrisDown, luulen, että ' viittaa tapaukseen, jossa awk kutsutaan nimellä -f kuten kohdassa awk -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ä versiossa awk. Mutta sillä ' ei ole merkitystä tässä asiassa, enkä todellakaan luottaisi siihen käyttäytymiseen (sisältäisin kuitenkin --).

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 

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *