Misalkan saya memiliki file yang mirip dengan yang berikut:
123
123
234
234
123
345
Saya ingin menemukan berapa kali '123' digandakan, berapa kali '234' digandakan, dll. Jadi idealnya, hasilnya akan seperti:
123 3
234 2
345 1
Misalkan saya memiliki file yang mirip dengan yang berikut:
123
123
234
234
123
345
Saya ingin menemukan berapa kali '123' digandakan, berapa kali '234' digandakan, dll. Jadi idealnya, hasilnya akan seperti:
123 3
234 2
345 1
Jawaban:
Dengan asumsi ada satu nomor per baris:
sort <file> | uniq -c
Anda dapat menggunakan --count
flag yang lebih verbose juga dengan versi GNU, misalnya, di Linux:
sort <file> | uniq --count
sort
lagi seperti:sort <file> | uniq -c | sort -n
Ini akan mencetak garis duplikat saja , dengan jumlah:
sort FILE | uniq -cd
atau, dengan opsi panjang GNU (di Linux):
sort FILE | uniq --count --repeated
pada BSD dan OSX Anda harus menggunakan grep untuk memfilter baris unik:
sort FILE | uniq -c | grep -v '^ *1 '
Untuk contoh yang diberikan, hasilnya adalah:
3 123
2 234
Jika Anda ingin mencetak jumlah untuk semua baris termasuk yang hanya muncul sekali:
sort FILE | uniq -c
atau, dengan opsi panjang GNU (di Linux):
sort FILE | uniq --count
Untuk input yang diberikan, outputnya adalah:
3 123
2 234
1 345
Untuk mengurutkan output dengan garis paling sering di atas, Anda dapat melakukan hal berikut (untuk mendapatkan semua hasil):
sort FILE | uniq -c | sort -nr
atau, untuk mendapatkan hanya garis duplikat, paling sering terlebih dahulu:
sort FILE | uniq -cd | sort -nr
pada OSX dan BSD yang terakhir menjadi:
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
| 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 '
Melalui awk:
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
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 dalam data
file, simpul dari array yang dinamai dups
bertambah.
Dan pada akhirnya, kita mengulang dups
array dengan num
variabel 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 $0
sebagai pengganti $1
perintah di atas :)
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
Get-Content .\file.txt | Group-Object | Select Name, Count
Kita juga bisa menggunakan mana-objek Cmdlet untuk memfilter hasilnya
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
Dengan asumsi Anda memiliki akses ke shell Unix standar dan / atau lingkungan cygwin:
tr -s ' ' '\n' < yourfile | sort | uniq -d -c
^--space char
Pada dasarnya: konversikan semua karakter spasi menjadi linebreak, lalu urutkan output yang ditranslasikan dan masukkan ke uniq dan hitung garis duplikat.