Namun inilah yang saya lakukan secara algoritmik. Ini sepertinya bukan pendekatan yang paling efisien (O (n log n) * avg_line_len di mana n adalah jumlah baris). Saya sedang mengerjakan file yang berukuran beberapa gigabytes, jadi kinerja adalah masalah utama. Saya bertanya-tanya apakah ada alat yang menghitung hanya dalam satu pass menggunakan pohon awalan (dalam kasus saya string sering memiliki awalan umum) atau serupa, yang seharusnya melakukan trik di O (n) * avg_line_len. Apakah ada yang tahu alat commandline seperti itu?
Droggl
21
Langkah tambahan adalah menyalurkan output itu ke perintah 'sort -n' akhir. Itu akan mengurutkan hasil dimana garis paling sering muncul.
samoz
79
Jika Anda hanya ingin mencetak garis duplikat, gunakan 'uniq -d'
DmitrySandalov
6
Jika Anda ingin kembali mengurutkan hasilnya, Anda dapat menggunakan sortlagi seperti:sort <file> | uniq -c | sort -n
Abhishek Kashyap
414
Ini akan mencetak garis duplikat saja , dengan jumlah:
Poin bagus dengan opsi --repeat atau -d. Jauh lebih akurat daripada menggunakan "| grep 2" atau serupa!
Lauri
Bagaimana saya bisa memodifikasi perintah ini untuk mengambil semua baris yang jumlah pengulangannya lebih dari 100?
Black_Rider
@ Black_Rider Menambahkan | sort -natau | sort -nrke pipa akan mengurutkan output berdasarkan jumlah pengulangan (masing-masing naik atau turun). Ini bukan yang Anda minta, tetapi saya pikir itu mungkin membantu.
Andrea
1
@Black_Rider awk tampaknya dapat melakukan semua jenis perhitungan: jika Anda dapat melakukannya| awk '$1>100'
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
Dalam awk 'dups[$1]++'perintah, variabel $1memegang seluruh isi kolom1 dan tanda kurung siku adalah akses array. Jadi, untuk setiap kolom pertama dari baris dalam datafile, simpul dari array yang dinamai dupsbertambah.
Dan pada akhirnya, kita mengulang dupsarray dengan numvariabel dan mencetak nomor yang disimpan terlebih dahulu kemudian jumlah nilai duplikatnya dups[num].
Perhatikan bahwa file input Anda memiliki spasi di ujung beberapa baris, jika Anda menjernihkannya, Anda dapat menggunakannya $0sebagai pengganti $1perintah di atas :)
Bukankah ini sedikit berlebihan mengingat yang kita miliki uniq?
Nathan Fellman
9
sort | uniqdan solusi awk memiliki kinerja & pertukaran sumber daya yang sangat berbeda: jika file besar dan jumlah baris yang berbeda kecil, solusi awk jauh lebih efisien. Itu linier dalam jumlah garis dan penggunaan ruang linier dalam jumlah garis yang berbeda. OTOH, solusi awk perlu menyimpan semua baris yang berbeda dalam memori, sementara (GNU) sort dapat menggunakan file temp.
Lars Noschinski
14
Di windows menggunakan "Windows PowerShell" Saya menggunakan perintah yang disebutkan di bawah ini untuk mencapai ini
Pada dasarnya: konversikan semua karakter spasi menjadi linebreak, lalu urutkan output yang ditranslasikan dan masukkan ke uniq dan hitung garis duplikat.
Jawaban:
Dengan asumsi ada satu nomor per baris:
Anda dapat menggunakan
--count
flag yang lebih verbose juga dengan versi GNU, misalnya, di Linux:sumber
sort
lagi seperti:sort <file> | uniq -c | sort -n
Ini akan mencetak garis duplikat saja , dengan jumlah:
atau, dengan opsi panjang GNU (di Linux):
pada BSD dan OSX Anda harus menggunakan grep untuk memfilter baris unik:
Untuk contoh yang diberikan, hasilnya adalah:
Jika Anda ingin mencetak jumlah untuk semua baris termasuk yang hanya muncul sekali:
atau, dengan opsi panjang GNU (di Linux):
Untuk input yang diberikan, outputnya adalah:
Untuk mengurutkan output dengan garis paling sering di atas, Anda dapat melakukan hal berikut (untuk mendapatkan semua hasil):
atau, untuk mendapatkan hanya garis duplikat, paling sering terlebih dahulu:
pada OSX dan BSD yang terakhir menjadi:
sumber
| sort -n
atau| sort -nr
ke pipa akan mengurutkan output berdasarkan jumlah pengulangan (masing-masing naik atau turun). Ini bukan yang Anda minta, tetapi saya pikir itu mungkin membantu.| awk '$1>100'
sort FILE | uniq -c | grep -v '^ *1 '
Untuk menemukan dan menghitung garis duplikat di banyak file, Anda dapat mencoba perintah berikut:
atau:
sumber
Melalui awk:
Dalam
awk 'dups[$1]++'
perintah, variabel$1
memegang seluruh isi kolom1 dan tanda kurung siku adalah akses array. Jadi, untuk setiap kolom pertama dari baris dalamdata
file, simpul dari array yang dinamaidups
bertambah.Dan pada akhirnya, kita mengulang
dups
array dengannum
variabel dan mencetak nomor yang disimpan terlebih dahulu kemudian jumlah nilai duplikatnyadups[num]
.Perhatikan bahwa file input Anda memiliki spasi di ujung beberapa baris, jika Anda menjernihkannya, Anda dapat menggunakannya
$0
sebagai pengganti$1
perintah di atas :)sumber
uniq
?sort | uniq
dan solusi awk memiliki kinerja & pertukaran sumber daya yang sangat berbeda: jika file besar dan jumlah baris yang berbeda kecil, solusi awk jauh lebih efisien. Itu linier dalam jumlah garis dan penggunaan ruang linier dalam jumlah garis yang berbeda. OTOH, solusi awk perlu menyimpan semua baris yang berbeda dalam memori, sementara (GNU) sort dapat menggunakan file temp.Di windows menggunakan "Windows PowerShell" Saya menggunakan perintah yang disebutkan di bawah ini untuk mencapai ini
Kita juga bisa menggunakan mana-objek Cmdlet untuk memfilter hasilnya
sumber
Dengan asumsi Anda memiliki akses ke shell Unix standar dan / atau lingkungan cygwin:
Pada dasarnya: konversikan semua karakter spasi menjadi linebreak, lalu urutkan output yang ditranslasikan dan masukkan ke uniq dan hitung garis duplikat.
sumber