Znajdź zduplikowane linie w pliku i policz, ile razy każda linia była duplikowana?

Załóżmy, że mam plik podobny do następującego:

123 
123 
234 
234 
123 
345

Chciałbym dowiedzieć się, ile razy "123" było powielane, ile razy " 234 " było powielane, itp. Więc idealnie, wyjście byłoby takie:

123  3 
234  2 
345  1
Author: lkisac, 2011-07-15

7 answers

Zakładając, że jest jedna liczba w linii:

sort <file> | uniq -c

Możesz użyć bardziej wyrazistego znacznika --count również w wersji GNU, np. na Linuksie:

sort <file> | uniq --count
 625
Author: wonk0,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-22 15:13:21

To wyświetli tylko zduplikowane linie , z licznikami:

sort FILE | uniq -cd

Lub, z długimi opcjami GNU (na Linuksie):

sort FILE | uniq --count --repeated

Na BSD i OSX musisz użyć grep aby odfiltrować unikalne linie:

sort FILE | uniq -c | grep -v '^ *1 '

Dla podanego przykładu wynikiem będzie:

  3 123
  2 234

Jeśli chcesz wydrukować zliczenia dla wszystkich linii łącznie z tymi, które pojawiają się tylko raz:

sort FILE | uniq -c

Lub, z długimi opcjami GNU (na Linuksie):

sort FILE | uniq --count

Dla podane wejście, wyjście to:

  3 123
  2 234
  1 345

Aby posortować wyjście z najczęstszymi liniami 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 duplikaty wierszy, najczęściej najpierw:

sort FILE | uniq -cd | sort -nr

Na OSX i BSD ostateczna wersja staje się:

sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
 319
Author: Andrea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:58

Aby znaleźć i policzyć zduplikowane linie w wielu plikach, możesz wypróbować następujące polecenie:

sort <files> | uniq -c | sort -nr

Lub:

cat <files> | sort | uniq -c | sort -nr
 64
Author: kenorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-10 21:06:14

Via awk :

awk '{dups[$1]++} END{for (num in dups) {print num,dups[num]}}' data

W poleceniu awk 'dups[$1]++' zmienna $1 przechowuje całą zawartość column1, a nawiasy kwadratowe są dostępem do tablicy. Tak więc dla każdej 1. kolumny linii w pliku data węzeł tablicy o nazwie dups jest zwiększany.

I na końcu zapętlamy tablicę dups z numjako zmienną i wypisujemy zapisane liczby najpierw ich liczbę zduplikowaną przez dups[num].

Zauważ, że Twój plik wejściowy ma spacje na końcu niektóre linie, jeśli je wyczyścisz, możesz użyć $0 zamiast $1 w Komendzie powyżej:)

 23
Author: αғsнιη,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-01 13:01:38

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ć Cmdletu where-object do filtrowania wyniku

Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
 10
Author: vineel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-31 13:13:49

Zakładając, że masz dostęp do Standardowej powłoki Uniksa i / lub środowiska cygwin:

tr -s ' ' '\n' < yourfile | sort | uniq -d -c
       ^--space char

Zasadniczo: Konwertuj wszystkie znaki spacji na linie, następnie posortuj tranlsowane wyjście i podaj je do uniq i policz zduplikowane linie.

 7
Author: Marc B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-07-15 19:57:12

Jeśli ktoś szuka strony internetowej, która wykonuje podobną pracę:

Http://www.kennistranslations.com/wordcount

 0
Author: PBA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-02 14:12:44