Perintah yang membaca teks sebagai kumpulan baris memadai untuk mencari dan mengganti, tetapi banyak pekerjaan membutuhkan struktur di dalam baris itu sendiri, misalnya mengambil field kedua dari setiap baris atau menjumlahkan angka pada field tertentu. Topik ini membahas awk, perintah sekaligus bahasa pemrograman mini yang membagi setiap baris menjadi field, yaitu potongan teks yang dipisahkan pembatas, lalu menjalankan program pola-aksi terhadapnya. Pembahasan mencakup pencetakan field, pola dan aksi, akumulasi perhitungan, serta penggantian pembatas. Setelah topik ini dibaca, data tabular di dalam berkas teks dapat diambil, disaring, dan dihitung dengan program berukuran satu baris.
Field dan pencetakan#
awk membaca masukan baris demi baris dan memecah setiap baris menjadi field menurut pembatasnya, yang secara default berupa spasi. Field pertama disebut $1, field kedua $2, dan seterusnya, sedangkan $0 menyimpan baris utuh dan NF menyimpan jumlah field pada baris tersebut. Nomor baris yang sedang diproses tersimpan dalam NR. Rujukan field juga dapat dibangun dari belakang, karena $NF menyimpan field terakhir dan $(NF-1) menyimpan field sebelumnya.
# membuat berkas nilai ujian
printf 'Ali 86\nBudi 78\nCitra 92\nDewi 81\nEka 88\n' > nilai.txt
cat nilai.txtAli 86
Budi 78
Citra 92
Dewi 81
Eka 88Aksi pencetakan memakai perintah print. Pemisahan dua nilai dengan koma menyisipkan spasi di antara keduanya, sehingga urutan field dapat diatur dengan bebas dan field yang sama dapat dicetak lebih dari satu kali dalam satu baris keluaran.
# mencetak field pertama setiap baris
awk '{print $1}' nilai.txtAli
Budi
Citra
Dewi
Eka# menukar urutan pencetakan kedua field
awk '{print $2, $1}' nilai.txt86 Ali
78 Budi
92 Citra
81 Dewi
88 EkaPada keluaran kedua, angka nilai muncul lebih dahulu karena urutan pencetakan ditukar. Yang dicetak tetap dua field terpisah, bukan satu teks utuh, dan pemisah di antara keduanya adalah spasi sesuai bawaan print.
Pola dan aksi#
Program awk tersusun atas pasangan pola dan aksi yang ditulis pola {aksi}. Aksi dijalankan untuk setiap baris yang memenuhi pola, sedangkan baris yang tidak memenuhi dilewati. Pola boleh ditulis kosong, dan pola yang kosong berarti aksi dijalankan untuk setiap baris. Di luar pasangan tersebut, awk menyediakan pola khusus BEGIN yang dijalankan sebelum baris pertama dibaca dan END yang dijalankan setelah baris terakhir diproses.
# pola perbandingan: hanya baris dengan nilai di atas 85 yang dicetak
awk '$2 > 85 {print $1}' nilai.txtAli
Citra
EkaPola $2 > 85 membandingkan field kedua sebagai angka, sehingga perbandingannya benar untuk nilai 86, 92, dan 88. Baris Budi 78 dan Dewi 81 tidak memenuhi pola, sehingga tidak dicetak sama sekali. Nama pemilik nilai itulah yang dicetak karena aksinya memilih $1.
# pola BEGIN dan END membungkus pemrosesan baris
awk 'BEGIN {print "Nama Nilai"} {print $1, $2} END {print "Jumlah baris:", NR}' nilai.txtNama Nilai
Ali 86
Budi 78
Citra 92
Dewi 81
Eka 88
Jumlah baris: 5Teks Nama Nilai dicetak sebelum baris pertama dibaca, kelima baris dicetak berurutan, dan kalimat penutup mencetak NR yang saat itu berisi 5. Teks yang dicetak oleh awk ditulis dengan tanda kutip ganda di dalam aksinya, berbeda dengan kutip tunggal yang mengapit seluruh program demi kepentingan shell.
Program mini dengan akumulasi#
Variabel pada awk dapat digunakan tanpa deklarasi. Variabel yang belum berisi dianggap bernilai 0 ketika dipakai dalam perhitungan, sehingga akumulasi dapat dimulai langsung. Pola yang paling umum adalah menambahkan nilai field ke variabel penjumlah pada setiap baris, lalu mencetak hasilnya di blok END.
# menjumlahkan seluruh nilai lalu menghitung rata-ratanya di blok END
awk '{total += $2} END {print "rata-rata:", total / NR}' nilai.txtrata-rata: 85Variabel total menampung jumlah seluruh nilai, yaitu 425, dan pembagian dengan NR menghasilkan rata-rata 85. Contoh berikut memakai pola yang sama untuk mencari nilai tertinggi beserta pemiliknya.
# mencari nilai tertinggi beserta pemiliknya
awk '$2 > maks {maks = $2; nama = $1} END {print nama, maks}' nilai.txtCitra 92Kedua variabel diperbarui bersama setiap kali field kedua melampaui nilai maks yang tersimpan, sehingga di akhir proses keduanya menyimpan nilai tertinggi beserta pemiliknya. Blok END kemudian mencetak Citra 92 sebagai hasil pencariannya. Pola akumulasi semacam ini adalah bentuk paling sederhana dari pemrosesan data yang membutuhkan penyimpanan keadaan antarbaris.
Pembatas lain dengan opsi -F#
Pembatas spasi tidak selalu tersedia. Berkas yang dipisahkan titik dua, misalnya daftar piket, diproses dengan opsi -F yang menetapkan karakter pembatasnya. Karakter pembatas ditulis tepat setelah opsi tanpa spasi, seperti -F: untuk titik dua.
# membuat berkas piket berpembatas titik dua
printf 'Senin: Ali\nSelasa: Budi\nRabu: Citra\n' > piket.txt
# mencetak field pertama dengan pembatas titik dua
awk -F: '{print $1}' piket.txtSenin
Selasa
RabuField kedua dari berkas yang sama tetap memuat spasi sebelum namanya, karena pembatas yang ditetapkan sendiri membuat awk memotong tepat pada setiap titik dua tanpa membersihkan spasi di sekelilingnya. Pembersihan spasi di awal dan di akhir field hanya berlaku pada pembatas bawaan. Apabila field kedua akan dipakai untuk perbandingan, spasi di depannya perlu diperhitungkan atau dihapus terlebih dahulu.
Kesalahan umum#
Kutip tunggal dan kutip ganda tertukar. Seluruh program awk diapit kutip tunggal agar shell tidak menyentuh isinya, sedangkan teks yang dicetak di dalam program memakai kutip ganda. Menulis awk '{print Nama}' tanpa kutip ganda menyebabkan Nama dianggap variabel kosong, sehingga keluarannya kosong pula.
Perbandingan angka dan teks tertukar. Pola $2 > 85 membandingkan field sebagai angka karena 85 ditulis tanpa kutip. Pola $2 > "85" membandingkan field sebagai teks menurut urutan karakter, dan hasilnya dapat berbeda dari perbandingan angka. Menetapkan jenis perbandingan secara sadar menghindari hasil yang membingungkan.
Kurawal atau kutip yang tertinggal. Program yang tidak menutup kurawal atau kutipnya menghasilkan pesan error sintaks sebelum pemrosesan dimulai. Pesan itu menyebut nomor baris program, sehingga posisi kesalahannya mudah dilacak. Memeriksa pasangan kutip tunggal, kutip ganda, dan kurawal sebelum menjalankan perintah tetap menjadi kebiasaan yang menghemat waktu.
Ringkasan#
awkmemecah setiap baris menjadi field yang diakses sebagai$1,$2, dengan$0menyimpan baris utuh,NFjumlah field, danNRnomor baris.- Program
awktersusun atas pasangan pola dan aksi, denganBEGINdanENDsebagai pola khusus pembuka dan penutup. - Variabel dapat dipakai tanpa deklarasi dan dianggap bernilai 0 pada perhitungan, sehingga akumulasi ditulis langsung di aksi dan hasilnya dicetak di blok
END. - Opsi
-Fmenetapkan pembatas field selain spasi, dan field hasilnya tidak dibersihkan dari spasi sekelilingnya.
Referensi#
- GAWK: Effective AWK Programming — Free Software Foundation — Bab Getting Started with awk dan bagian variabel bawaan merinci pemecahan field serta pasangan pola-aksi.