Załóżmy, że mam plik podobny do następującego:
123
123
234
234
123
345
Chciałbym dowiedzieć się, ile razy „123” zostało zduplikowane, ile razy „234” zostało zduplikowane, itd. Idealnie byłoby, gdyby wynik był:
123 3
234 2
345 1
Załóżmy, że mam plik podobny do następującego:
123
123
234
234
123
345
Chciałbym dowiedzieć się, ile razy „123” zostało zduplikowane, ile razy „234” zostało zduplikowane, itd. Idealnie byłoby, gdyby wynik był:
123 3
234 2
345 1
Odpowiedzi:
Zakładając, że w jednym wierszu jest jedna liczba:
sort <file> | uniq -c
Możesz użyć bardziej szczegółowej --count
flagi również w wersji GNU, np. W systemie Linux:
sort <file> | uniq --count
sort
ponownie w następujący sposób:sort <file> | uniq -c | sort -n
Spowoduje to wydrukowanie tylko zduplikowanych linii z podaniem:
sort FILE | uniq -cd
lub, z długimi opcjami GNU (w systemie Linux):
sort FILE | uniq --count --repeated
na BSD i OSX musisz użyć grep, aby odfiltrować unikalne linie:
sort FILE | uniq -c | grep -v '^ *1 '
W podanym przykładzie wynik byłby następujący:
3 123
2 234
Jeśli chcesz wydrukować liczby dla wszystkich linii, w tym tych, które pojawiają się tylko raz:
sort FILE | uniq -c
lub, z długimi opcjami GNU (w systemie Linux):
sort FILE | uniq --count
Dla danych wejściowych dane wyjściowe to:
3 123
2 234
1 345
Aby posortować dane wyjściowe z najczęstszymi wierszami na górze, możesz wykonać następujące czynności (aby uzyskać wszystkie wyniki):
sort FILE | uniq -c | sort -nr
lub, aby uzyskać tylko zduplikowane linie, najczęściej:
sort FILE | uniq -cd | sort -nr
w OSX i BSD wersja ostateczna staje się:
sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
| sort -n
lub | sort -nr
do potoku posortuje dane wyjściowe według liczby powtórzeń (odpowiednio rosnąco lub malejąco). Nie o to pytasz, ale pomyślałem, że to może pomóc.
| awk '$1>100'
sort FILE | uniq -c | grep -v '^ *1 '
Przez awk:
awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data
W awk 'dups[$1]++'
poleceniu zmienna $1
przechowuje całą zawartość kolumny 1, a nawiasy kwadratowe mają dostęp do tablicy. Tak więc, dla każdej pierwszej kolumny linii w data
pliku, węzeł nazwanej tablicy dups
jest zwiększany.
Na koniec zapętlamy dups
tablicę num
jako zmienną i najpierw wypisujemy zapisane liczby, a następnie ich liczbę zduplikowanych wartości dups[num]
.
Zauważ, że twój plik wejściowy ma spacje na końcu niektórych linii, jeśli je wyczyścisz, możesz użyć $0
zamiast $1
polecenia in powyżej :)
uniq
?
sort | uniq
a rozwiązanie awk ma całkiem inną kompromis między wydajnością i zasobami: jeśli pliki są duże, a liczba różnych linii jest niewielka, rozwiązanie awk jest znacznie wydajniejsze. Jest liniowy pod względem liczby linii, a wykorzystanie miejsca jest liniowe pod względem liczby różnych linii. OTOH, rozwiązanie awk musi zachować wszystkie różne linie w pamięci, podczas gdy sortowanie (GNU) może uciekać się do plików tymczasowych.
W systemie Windows za pomocą „Windows PowerShell” użyłem polecenia wymienionego poniżej, aby to osiągnąć
Get-Content .\file.txt | Group-Object | Select Name, Count
Możemy również użyć polecenia cmdlet where-object do filtrowania wyniku
Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
Zakładając, że masz dostęp do standardowej powłoki Unix i / lub środowiska cygwin:
tr -s ' ' '\n' < yourfile | sort | uniq -d -c
^--space char
Zasadniczo: przekonwertuj wszystkie znaki spacji na podziały wierszy, a następnie posortuj przetłumaczone dane wyjściowe i podaj je do uniq i policz duplikaty linii.