Aşağıdakine benzer bir dosyam olduğunu varsayalım:
123
123
234
234
123
345
Kaç kez '123' kopyalandığını, kaç kez '234' kopyalandığını vs. bulmak istiyorum. İdeal olarak çıktı şöyle olur:
123 3
234 2
345 1
Aşağıdakine benzer bir dosyam olduğunu varsayalım:
123
123
234
234
123
345
Kaç kez '123' kopyalandığını, kaç kez '234' kopyalandığını vs. bulmak istiyorum. İdeal olarak çıktı şöyle olur:
123 3
234 2
345 1
Yanıtlar:
Satır başına bir sayı olduğunu varsayarsak:
sort <file> | uniq -c
--count
GNU sürümü ile daha ayrıntılı bayrağı da kullanabilirsiniz , örneğin Linux'ta:
sort <file> | uniq --count
sort
:sort <file> | uniq -c | sort -n
Bu, yalnızca yinelenen satırları sayılarak yazdırır :
sort FILE | uniq -cd
veya GNU uzun seçenekleriyle (Linux'ta):
sort FILE | uniq --count --repeated
üzerinde BSD ve OSX sen grep kullanmak zorunda eşsiz hatları üzerinden filtreye:
sort FILE | uniq -c | grep -v '^ *1 '
Verilen örnek için sonuç şöyle olacaktır:
3 123
2 234
Yalnızca bir kez görünen satırlar dahil tüm satırların sayılarını yazdırmak istiyorsanız :
sort FILE | uniq -c
veya GNU uzun seçenekleriyle (Linux'ta):
sort FILE | uniq --count
Verilen giriş için çıktı:
3 123
2 234
1 345
Amacıyla çıktıyı sıralamak üstünde en sık çizgilerle, (tüm sonuçları almak için) şunları yapabilirsiniz:
sort FILE | uniq -c | sort -nr
veya yalnızca yinelenen satırları elde etmek için, en sık kullanılanı:
sort FILE | uniq -cd | sort -nr
OSX ve BSD'de sonuncusu:
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
| sort -n
veya ekleme | sort -nr
, çıkışı tekrar sayısına göre sıralar (sırasıyla artan veya azalan). İstediğiniz bu değil ama yardımcı olabileceğini düşündüm.
| awk '$1>100'
sort FILE | uniq -c | grep -v '^ *1 '
Üzerinden awk:
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
Olarak awk 'dups[$1]++'
komut, değişken $1
column1 tüm içeriği tutan ve köşeli parantezler dizi erişimi bulunmaktadır. Bu nedenle, data
dosyadaki her 1. satır sütunu için , adlandırılan dizinin düğümü dups
artırılır.
Ve sonunda, değişken olarak dups
dizi üzerinde döngü yapıyoruz num
ve önce kaydedilen sayıları sonra kopya değerlerini yazdırıyoruz dups[num]
.
Giriş dosyanızın bazı satırların sonunda boşluk olduğunu unutmayın, bunları temizlerseniz yukarıdaki komut $0
yerine kullanabilirsiniz $1
:)
uniq
mi?
sort | uniq
ve awk çözümü oldukça farklı performans ve kaynak değiş tokuşlarına sahiptir: dosyalar büyükse ve farklı satır sayısı azsa, awk çözümü çok daha verimlidir. Satır sayısında doğrusaldır ve alan kullanımı farklı satır sayısında doğrusaldır. Awch çözümünün tüm farklı satırları bellekte tutması gerekirken (GNU) sıralaması geçici dosyalara başvurabilir.
"Windows PowerShell" kullanan pencerelerde bunu başarmak için aşağıda belirtilen komutu kullandım
Get-Content .\file.txt | Group-Object | Select Name, Count
Ayrıca sonucu filtrelemek için where-nesne Cmdlet'ini kullanabiliriz
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
Standart bir Unix kabuğuna ve / veya cygwin ortamına erişiminiz olduğunu varsayarsak:
tr -s ' ' '\n' < yourfile | sort | uniq -d -c
^--space char
Temel olarak: tüm boşluk karakterlerini satır satırlarına dönüştürün, sonra aktarılan çıktıyı sıralayın ve bunu uniq'e besleyin ve yinelenen satırları sayın.