Gambaran
Awk adalah pembuat laporan, yang memiliki kemampuan pemformatan teks yang kuat, yang merupakan istilah profesional.
Anda mungkin tidak mengerti apa yang disebut "report" dalam apa yang disebut pembuat laporan. Anda dapat memahami "report" sebagai "report" atau "table". Dengan kata lain, kita dapat menggunakan perintah awk untuk mengatur beberapa teks menjadi apa yang kita inginkan Misalnya, atur beberapa teks ke dalam "tabel" dan kemudian tampilkan. "Kemampuan pemformatan teks" yang tadi disebutkan dalam konsep berarti begini. Sebenarnya, ini mungkin tidak mudah untuk dipahami. Jangan khawatir, saat Anda melihat "contoh" berikut, Anda akan secara alami memahami apa yang bagus dalam kemampuan "pemformatan teks".
Bagikan 3 contoh awk, dan melalui tiga contoh awk ini untuk membantu Anda memahami beberapa sintaks perintah awk.
dasar-dasar awk
Tata bahasa dasar awk adalah sebagai berikut, tidak masalah jika Anda tidak mengerti, kami akan memberikan contoh perlahan.
awk'program 'file1, file2, "Untuk program pada tata bahasa di atas dapat dibagi lagi menjadi pola dan tindakan, yaitu tata bahasa dasar awk adalah sebagai berikut
awk'Pattern {Action} 'Secara harfiah dipahami, tindakan mengacu pada tindakan. Awk pandai memformat teks dan akan mengeluarkan teks yang diformat. Jadi tindakan awk yang paling umum digunakan adalah print dan printf, karena awk perlu mengeluarkan teks yang diformat. Oleh karena itu, kedua tindakan ini paling umum digunakan.
Awk diproses baris demi baris. Arti dari pemrosesan baris demi baris berarti bahwa ketika awk memproses teks, ia akan memprosesnya baris demi baris. Setelah baris saat ini diproses, baris berikutnya akan diproses. Awk default ke "baris baru" sebagai tanda untuk mengidentifikasi masing-masing Satu baris, artinya, awk seperti kita manusia. Setiap kali menemukan "carriage return dan line feed", itu dianggap sebagai akhir baris saat ini dan awal baris baru. Awk akan membagi baris saat ini sesuai dengan pemisah yang ditentukan oleh pengguna. Tidak ada pemisah yang ditentukan, dan spasi digunakan sebagai pemisah secara default.
ps: grep, sed, dan awk disebut sebagai "Three Musketeers" di Linux.
grep lebih cocok untuk pencarian sederhana atau teks yang cocok
sed lebih cocok untuk mengedit teks yang cocok
Awk lebih cocok untuk pemformatan teks, dan pemformatan teks yang lebih kompleks
1. Left join query dalam database serupa
informasi dasar
# kucing a.txt 111 aaa 222 bbb 333 cccc 444 hhh # kucing b.txt 1111234562 abc cbd 444 rts 786Hal yang Diperlukan: Hasil keluarannya adalah:
111, aaa, 123.456444, ddd, rts, 786Metode implementasi 1:
# awk'NR == FNR {a = $ 2;} NR! = FNR a {print $ 1 "," a "," $ 2 "," $ 3} 'a.txt b.txt 111, aaa, 123.456444, ddd, rts, 786Penjelasan: Jika NR dan FNR sama, artinya anda mengoperasikan file pertama, a = $ 2 artinya membuat array, dengan field pertama sebagai subskrip dan field kedua sebagai nilainya. Ketika NR! = FNR, itu berarti Anda mengoperasikan file kedua. Catatan: Saat ini, $ 1 dan $ 1 sebelumnya tidak sama. $ 1 sebelumnya mewakili bidang pertama a.txt, dan yang terakhir $ 1 mewakili bidang pertama b.txt. a mewakili nilai bidang pertama di b.txt sebagai subskrip. Jika a memiliki nilai, itu juga ada di file a.txt, jadi cetak saja datanya.
Metode implementasi 2,
# awk -v OFS = "," 'NR == FNR {a = $ 2;} NR! = FNR $ 1 dalam {cetak $ 1, a, $ 2, $ 3}' a.txt b.txt 111, aaa, 123.456444, ddd, rts, 786Penjelasan: -v OFS = "," Ini adalah pemisah kolom saat mengatur output, $ 1 dalam a Ini adalah apakah nilai kolom pertama dalam file b.txt ada di kunci array a. Ini mudah dipahami oleh programmer. Ada penggunaan atau fungsi seperti itu dalam berbagai bahasa. Misalnya ada fungsi in_array di php. Bandingkan cetakan dalam metode 1 dan metode 2. Dalam metode 1, saya menambahkan tanda kutip ganda, dan dalam metode 2, saya tidak menambahkannya, tetapi efek keluarannya sama.
Dua, hapus nilai duplikat
informasi dasar:
# kucing c.txt a b c d e f b d b a f e 12 dua puluh satuSyarat: Jika ada kasus seperti a, b dan b, a, hapus b, a, yaitu menghapus nilai duplikat, dan tentu saja angkanya sama;
Metode implementasi 1:
# awk '{untuk (i = 1; i < = NF; i ++) a = $ i; asort (a); untuk (i = 1; i < = panjang (a); i ++) printf a "\ t"; printf "\ n"} 'c.txt | sort | uniq 12 a b b d c d e fPenjelasan: untuk (i = 1; i < = NF; i ++) a = $ i; Letakkan dua bidang di setiap kolom ke dalam larik, asort (a) , Larik ini diurutkan, dan kode berikut ini untuk mengeluarkan data larik. Data masukan disortir melalui perintah sortir. Data yang sama akan disortir bersama, dan kolom yang sama akan dihapus melalui uniq. Metode ini lebih serbaguna, tidak hanya cocok untuk dua kolom, tiga kolom, atau empat kolom. Tetapi efisiensinya sedikit lebih buruk.
Metode implementasi 2:
# awk '{a = $ 0; if (! ($ 2 OFS $ 1 in a)) cetak a}' c.txt a b c d e f b d 12 # awk '{a; if (! ($ 2 OFS $ 1 in a)) print}' c.txt a b c d e f b d 12Penjelasan: Kedua cara penulisan cara 2, hasilnya sama, Sebuah; Tidak ada tugas dan tidak ada kesalahan. Mengapa? Ketika awk menemukan variabel yang tidak terdefinisi, itu akan memberikan nilai awal. if (! ($ 2 OFS $ 1 in a)) Menunjukkan bahwa field yang dikembalikan tidak ada dalam larik a. Di sini, ini berarti apakah kunci tersebut ada, bukan nilainya. Cetak tidak menulis baris secara default.
Metode implementasi 3:
# awk '! a ++! a ++' c.txt a b c d e f b d 12 # awk '{if (! a ++! a ++) print $ 0;}' c.txt a b c d e f b d 12Penjelasan: ! a ++! a ++ sama dengan if (! a ++! a ++) , Sebagai catatan yang pertama kali muncul, Sebuah Nilai tidak ditentukan, Karena ++ yang terakhir adalah perhitungan matematis, a akan diberi angka 0 , Juga karena operator ++, ini akan mengambil nilai terlebih dahulu dan kemudian menghitungnya, Dari kiri ke kanan, prioritas operator ++ lebih besar dari! Operator Jadi, untuk baris pertama record, sebenarnya if (! 0) print $ 0! Is inverse, 0 is false, dan! 0 true, maka cetakan berikut $ 0 akan dieksekusi. Untuk record berulang yang muncul kemudian, pass + Perhitungan + menjadi 1, 2, 3. . . Dan! 1! 2! 3 ... semuanya salah dan tidak akan dicetak.
Tiga, variabel lokal awk
Mari kita gunakan contoh untuk mengilustrasikan, variabel lokal aneh yang aneh
Informasi dasar:
# kucing d.txt 12 dua puluh tiga a b 32 41 3 rSyarat: Jumlahkan baris yang semuanya adalah angka, angka terbesar, baris pertama adalah 2, baris kedua adalah 3, setiap empat baris adalah 3, baris kelima adalah 4, dan totalnya adalah 12
Penerapan:
# cat add.sh function max (satu, dua) { jika satu > dua){ jumlah = jumlah + satu; }lain{ jumlah = jumlah + dua; } } {jika ($ 1 ~ "" $ 2 ~ "") maks ($ 1, $ 2);} AKHIR {print "sum =" sum}Dalam metode maks, jumlah variabel akan mempengaruhi bagian luar, dan jumlah di sini bersifat global.
# awk -f add.sh d.txt jumlah = 12Tempatnya terbatas, jadi saya akan ambil 3 contoh awk klasik lagi untuk didemonstrasikan. Anda dapat membacanya beberapa kali. Jika sudah memahami dengan baik, penggunaan awk akan jauh lebih mudah ~
Beberapa penggunaan lebih banyak perintah linux akan dibagikan nanti, teman yang tertarik dapat memperhatikannya!
- Keuntungan Xiaomi per ponsel hanya 2 yuan! Akhirnya mengerti mengapa Lei Jun disebut tukang daging harga!
- Sudahkah Anda menggunakan pembuat enkode mutlak? Ini pasti metode pengukuran yang paling akurat, tidak ada siapa-siapa!
- Wang Dalu berfoto bersama di pesta tersebut, dan secara tak terduga menemukan bahwa Jackie Chan dan putranya berada dalam bingkai yang sama, dipisahkan oleh Wang Leehom dan istrinya.
- Perangkat lunak yang diperlukan untuk pengukuran suhu industri, berbagi perangkat lunak hijau termokopel dan tabel indeks tahan panas!