Dapatkan baris muncul paling umum dari file di Linux

11

Saya memiliki file teks yang memiliki berbagai kata per baris.
Bagaimana saya bisa menemukan 12 baris yang paling sering muncul dalam file dan menampilkannya?
Saya tidak begitu baik dengan perintah scripting.

Jika saya bisa mendapatkan perintah dan penjelasan sehingga saya bisa mengerti cara menggunakannya dan memperluas pengetahuan saya tentang perintah itu akan bagus!

Jim
sumber
stackoverflow.com/questions/16922357/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Jawaban:

21

Anda dapat dengan mudah melakukan ini dengan perintah bawaan.

  • Beri makan isi file sort. Kami membutuhkan ini untuk langkah selanjutnya.
  • Ini berlaku untuk uniq -c. Ini akan menghitung kemunculan unik dari setiap baris. Jika garis yang serupa tidak berdekatan, ini tidak akan berhasil tanpa menyortir sebelumnya.
  • Kemudian, beri makan ke yang lain sort, yang sekarang mengurutkan dalam urutan terbalik ( r) dan berdasarkan ninterpretasi numerik ( ) dari uniqoutput. Kita perlu opsi numerik karena jika tidak, ruang di depan nomor akan mengakibatkan hasil yang salah (lihat GNU sortbantuan 's untuk lebih).
  • Akhirnya, hanya tampilkan dua belas baris pertama dengan head.

Perintahnya adalah:

sort test.txt | uniq -c | sort -rn | head -n 12

Output di sini berisi jumlah kejadian yang sebenarnya.

Untuk hanya mendapatkan daftar garis mentah, Anda dapat menyalurkan output ke sed:

sort test.txt | uniq -c | sort -rn | head -n 12 | sed -E 's/^ *[0-9]+ //g'

Contoh:

I'm not there very often
I'm not there very often
Look at me!
Look at me!
Look at me!
Hello there!
Hello there!
Hello there!
Hello there!
Hello there!
Hello there!

Output dari perintah pertama, tetapi hanya memilih 2 dari head:

6 Hello there!
3 Look at me!

Output dari perintah kedua:

Hello there!
Look at me!
slhck
sumber
1
Anda harus mengurutkannya sebelum menggunakan uniq.
cYrus
@ Slhck: Terima kasih! Satu pertanyaan: Urutan sort -rndalam urutan terbalik menggunakan sebagai bidang pengurutan nomor di sebelah setiap baris yang diproduksi oleh uniq -c? Saya pikir sesuatu seperti k1atau sesuatu seperti itu akan digunakan
Jim
@ Jim Tepat. rmembalikkan, dan secara nnumerik mengurutkan pada nomor yang dihasilkan oleh uniq. Apa sebenarnya yang Anda maksud dengan k1?
slhck
@ Slhck: Saya mencoba untuk mencari tahu perintah ini menggunakan mandan saya mengerti bahwa sintaks menggunakan -ksesuatu harus digunakan untuk memilih bidang untuk mengurutkan berdasarkan
Jim
@ cYrus: Apa kasus tepi yang diperlukan semacam sebelumnya?
Jim
3

Jika distro Anda memiliki logtop

cat your_file | logtop

Jika file Anda terus bertambah, seperti file log, coba:

tail -f your_log | logtop
Julien Palard
sumber