BEGIN dan END dengan perintah awk


13

Menurut manual awk, BEGIN dan END tidak digunakan untuk mencocokkan input, melainkan untuk memberikan informasi start-up dan pembersihan ke skrip awk. Ini adalah contoh yang diberikan:

ls -l | \
awk 'BEGIN { print "Files found:\n" } /\<[a|x].*\.conf$/ { print $9 }'
Files found:
amd.conf
antivir.conf
xcdroast.conf
xinetd.conf

Pertama, ini mencetak string ke output. Kemudian ia memeriksa input untuk kecocokan pola, di mana input dimulai dengan a atau x diikuti oleh karakter apa saja atau berkali-kali diikuti oleh .conf. Untuk setiap pertandingan, kolom ke-9 dicetak.

Fakta bahwa kita dipaksa untuk menggunakan mulai di sini, apakah itu berarti awk hanya dapat menggunakan paling banyak satu fungsi cetak yang mengandung BEGIN atau END? Jika tidak, mengapa kita tidak bisa menggunakan fungsi cetak saja di awal tanpa kata kunci BEGIN? Tampaknya BEGIN itu berlebihan.


Cukup menjalankan perintah tanpa BEGIN akan menjawab pertanyaan Anda, menunjukkan bahwa itu tidak berlebihan dan Anda akan mendapatkan hasil yang berbeda.
msb

Jawaban:


11

Itu BEGINtidak berlebihan. Jika Anda tidak menentukan BEGINmaka printakan dieksekusi untuk setiap baris input.

Mengutip dari manual :

Sebuah BEGINaturan dijalankan sekali saja, sebelum record input pertama dibaca. Demikian juga, ENDaturan dijalankan hanya sekali, setelah semua input dibaca.

$ seq 5 | awk 'BEGIN{print "Hello"}/4/{print}'   # Hello printed once
Hello
4
$ seq 5 | awk '{print "Hello"}/4/{print}'        # Hello printed for each line of input
Hello
Hello
Hello
Hello
4
Hello
$

7

awkmemproses setiap jalur input untuk ekspresi yang diberikan dalam badan selain BEGINdan ENDblok. Dalam kasus BEGINdan ENDblok, awkakan memproses pernyataan hanya sekali, sebelum pemrosesan input dimulai dan setelah pemrosesan input dilakukan masing-masing. Tanpa BEGINblok, tidak hanya Anda tidak akan dapat mencetak informasi satu kali seperti header, Anda tidak akan dapat secara efisien menginisialisasi beberapa variabel yang diperlukan oleh tubuh. Juga, FYI, suatu awkprogram dapat memiliki banyak BEGINdan ENDblok.


2

awkmengeksekusi setiap blok hanya ketika pola sebelum cocok. Pola kosong (blok saja) cocok dengan setiap baris. BEGINdan ENDmerupakan pola khusus yang cocok dengan awal dan akhir file (analog dengan arti ^dan $arah horizontal).

Jika Anda ingin melakukan sesuatu sebelum membaca file, gunakan BEGIN. Misalnya, inisialisasi penghitung atau sesuatu. ENDkemudian dapat mengumpulkan hasilnya.


0

Dalam contoh yang diberikan, yang saya pikir disederhanakan untuk kejelasan pedagogik, Anda benar bahwa itu berlebihan. Anda bisa mendapatkan hasil yang sama tanpa menggunakan BEGIN.

1 == NR            { print "Files found:\n" }
/\<[a|x].*\.conf$/ { print $9               }

akan menghasilkan hasil yang sama karena pernyataan cetak dibatasi hanya pada baris input pertama.

Yang sedang berkata, BEGINdan ENDblok adalah alat yang sangat kuat. Seperti solusi lain telah disebutkan, Anda dapat menggunakan BEGINblok untuk menginisialisasi variabel atau rutinitas lain yang hanya perlu dilakukan sekali tetapi juga dapat digunakan untuk menjalankan perintah Awk ketika tidak ada file untuk diproses. Contoh sederhana:

BEGIN { print sqrt(12/4) }

Anda dapat melihat contoh pemrograman yang lebih serius dalam Awk tanpa memproses input apa pun di sini .

Demikian juga, ENDblok ini sangat berguna untuk melakukan perhitungan dan meringkas semua input. Ini tidak dapat dilakukan (biasanya) tanpa terlebih dahulu membaca semua data. Contoh sederhana untuk meringkas input dapat ditemukan di sini

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.