Direproduksi dari ini sekarang ditutup sebagai pertanyaan rangkap karena mencakup peringatan tentang pembatasan variabel awk yang mungkin berguna.
Sebuah variabel shell hanya itu: sebuah shell variabel . Jika Anda ingin mengubahnya menjadi variabel awk , Anda memerlukan sintaksis seperti:
awk -v x="$x" '$2 == x {print $1}' infile
atau
awk '$2 == x {print $1}' x="$x" infile
Namun, mereka yang mengalami masalah: urutan pelarian diperluas di dalamnya (dan dengan GNU awk4.2 atau lebih tinggi, jika $xdimulai dengan @/dan berakhir /, diperlakukan sebagai jenis variabel regexp ).
Jadi, misalnya jika variabel shell berisi dua karakter garis miring terbalik dan n , variabel awk akan berakhir mengandung karakter baris baru (dan dengan gawk 4.2+, jika mengandung @/foo/, variabel awk akan berisi foodan bertipe regexp).
Pendekatan lain (tetapi yang -vmembutuhkan untuk POSIX awk atau nawk (sebagai lawan dari tahun 1970-an masih ditemukan seperti /bin/awkpada Solaris)) adalah menggunakan variabel lingkungan:
x="$x" awk '$2 == ENVIRON["x"] {print $1}' infile
Pendekatan lain (masih dengan awk yang lebih baru) adalah dengan menggunakan array ARGV di awk:
awk 'BEGIN {x = ARGV[1]; delete ARGV[1]}
$2 == x {print $1}' "$x" infile
awkmemperluas urutan pelarian seperti-C di$1, sehingga pendekatan tidak bekerja jika$1mungkin berisi karakter garis miring terbalik (umum untuk regexps). Anda dapat menggunakanENVIRONarray khusus awk sebagai gantinya.