Mengapa awk mencetak seluruh baris ketika saya ingin mencetak variabel?

24

Saat saya mengetik:

echo "foo bar" | gawk -v var="content" '{print $var}'

Saya mengharapkan hasilnya content. Kenapa begitu foo bar?

nicoco
sumber
8
Coba hapus $dari $ var
taliezin
Memang. Saya bingung dengan sintaks bash ...
nicoco
Ini pertanyaan yang bagus dan meskipun jawabannya menunjukkan bahwa $itu salah tempat, saya tidak yakin itu harus ditutup sebagai salah ketik. Saya telah melihat beberapa di antaranya baru-baru ini, jadi mungkin kita perlu yang kanonik
roaima

Jawaban:

45

Variabel dirujuk dengan nama seperti dalam var, bukan $vardalam awk. $nmerujuk ke bidang nth : untuk bidang pertama, untuk yang kedua ... atau seluruh catatan untuk == 0 ( adalah catatan penuh).$1$2n$0

Itu tidak harus angka harafiah. Anda bisa menggunakan $(1+1)atau $variable. Jika variableberisi 1, maka $variableakan menjadi bidang pertama. Yang umum digunakan adalah $NFuntuk bidang terakhir ( NFadalah variabel khusus yang berisi jumlah bidang).

Jika, seperti dalam contoh Anda, variabel tidak berisi angka, yang non-angka dipahami sebagai 0.

Jadi var="content"; print $var, sama dengan var=0; print $var, dan dengan demikian sama dengan print $0, yaitu mencetak seluruh catatan.

Yang Anda inginkan di sini adalah:

echo "foo bar" | gawk -v var="content" '{print var}'
Stéphane Chazelas
sumber