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 awk
4.2 atau lebih tinggi, jika $x
dimulai 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 foo
dan bertipe regexp
).
Pendekatan lain (tetapi yang -v
membutuhkan untuk POSIX awk atau nawk (sebagai lawan dari tahun 1970-an masih ditemukan seperti /bin/awk
pada 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
awk
memperluas urutan pelarian seperti-C di$1
, sehingga pendekatan tidak bekerja jika$1
mungkin berisi karakter garis miring terbalik (umum untuk regexps). Anda dapat menggunakanENVIRON
array khusus awk sebagai gantinya.