Katakanlah saya memiliki file teks seperti:
R1 12 324 3453 36 457 4 7 8
R2 34 2342 2525 25 25 26 26 2 2
R3 23 2342 32 52 54 543 643 63
R4 25 234 2342 4 234242
Saya ingin menggunakan awk
untuk memproses garis-garis ini secara berbeda, seperti
awk '/R1/ { print "=>" $0} /R2/ { print "*" $0} '
dan saya juga ingin mencetak semua sisa baris (tanpa membuat duplikat dari baris yang sudah saya proses), pada dasarnya saya perlu /ELSE/ { print $0}
di akhir awk
baris saya .
Apakah ada hal seperti itu?
awk
mengimplementasikan tersangka yang biasa ketika datang ke kondisional. Sebaiknya gunakanprintf
alih-alihprint
untuk pekerjaan yang ingin Anda lakukan saat pertandingan.sumber
if-then-else
ini.next
adalah alat penting dalam pemrograman awk.printf
sini. Satu-satunya keuntungan (kecuali Anda melakukan pemformatan yang lebih menarik daripada gabungan) adalah tidak menambah baris baru, yang tidak relevan di sini.print
hanya memiliki keluaran$0
sedangkanprintf
harus mem-parsing format string.Chris Down sudah menunjukkan bagaimana Anda bisa mendapatkan yang lain untuk regexps dengan menggunakan pernyataan 'jika' eksplisit di blok. Anda juga bisa mendapatkan efek yang sama dengan beberapa cara lain, meskipun solusinya mungkin lebih baik.
Pertama adalah menulis regex ketiga yang hanya akan cocok dengan teks yang tidak cocok dengan yang lain, dalam kasus Anda, ini akan terlihat seperti ini:
Catatan, ini menggunakan regexps berlabuh - ^ di awal regexps hanya akan cocok pada awal baris - pola asli Anda tidak melakukan ini, yang memperlambat pencocokan sedikit karena akan memeriksa semua karakter pada baris daripada melewatkan hingga baris berikutnya. Kasus ketiga ("lain") akan cocok dengan garis yang dimulai dengan beberapa karakter yang bukan 'R' ([^ R]) atau yang dimulai dengan 'R' diikuti oleh karakter yang bukan '1' atau ' 2 '(R [^ 12]). Dua arti ^ yang berbeda agak membingungkan, tetapi kesalahan itu dibuat sejak lama dan tidak akan berubah dalam waktu dekat.
Untuk menggunakan regexps komplementer, mereka benar-benar perlu berlabuh, karena jika [^ R] akan cocok misalnya 1 yang mengikutinya. Untuk regexps yang sangat sederhana seperti yang Anda miliki, pendekatan ini bisa bermanfaat, tetapi ketika regexps menjadi lebih kompleks, pendekatan ini akan menjadi tidak terkelola. Sebagai gantinya, Anda dapat menggunakan variabel status untuk setiap baris, seperti ini:
Set ini ditangani ke nol untuk setiap baris baru, lalu ke 1 jika cocok dengan salah satu dari kedua regexps, dan akhirnya, jika masih nol, jalankan cetakan $ 0.
sumber
rfile
hanya 10.000 baris dataset kuesioner yang diulang.if (!handled)
Huek! Gunakannext
untuk berhenti mempertimbangkan tindakan lain.if (!handled)
. Solusi umum, fleksibel, dapat digunakan kembali adalah baik. Bagaimana jika orang berikutnya yang memiliki pertanyaan ini ingin melakukan lebih banyak pemrosesan setelah pencetakan? Jawaban dengannext
tidak mendukung itu.