Найти дубликаты строк в файле и посчитать, сколько раз каждая строка дублировалась? - PullRequest
454 голосов
/ 15 июля 2011

Предположим, у меня есть файл, подобный следующему:

123 
123 
234 
234 
123 
345

Я хотел бы узнать, сколько раз дублировалось «123», сколько дублировалось «234» и т. Д. Так что в идеале вывод будет выглядеть так:

123  3 
234  2 
345  1

Ответы [ 6 ]

703 голосов
/ 15 июля 2011

Предполагается, что в каждой строке по одному номеру:

sort <file> | uniq -c

Вы также можете использовать более подробный флаг --count с версией GNU, например, в Linux:

sort <file> | uniq --count
362 голосов
/ 07 июня 2013

Это будет печатать только повторяющиеся строки , с количеством:

sort FILE | uniq -cd

или с длинными параметрами GNU (в Linux):

sort FILE | uniq --count --repeated

вкл BSD и OSX вы должны использовать grep , чтобы отфильтровать уникальные строки:

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

Для данного примера, результат будет:

  3 123
  2 234

Если вы хотите напечатать счетчики для всех строк , включая те, которые появляются только один раз:

sort FILE | uniq -c

или с длинными параметрами GNU (в Linux):

sort FILE | uniq --count

Для данного ввода вывод:

  3 123
  2 234
  1 345

Чтобы отсортировать вывод с самыми частыми строками сверху, вы можете сделать следующее (чтобы получитьвсе результаты):

sort FILE | uniq -c | sort -nr

или, чтобы получить только повторяющиеся строки, чаще всего сначала:

sort FILE | uniq -cd | sort -nr

на OSX и BSD, окончательным становится:

sort FILE | uniq -c | grep -v '^ *1 ' | sort -nr
68 голосов
/ 14 мая 2013

Чтобы найти и сосчитать повторяющиеся строки в нескольких файлах, вы можете попробовать следующую команду:

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

или:

cat <files> | sort | uniq -c | sort -nr
27 голосов
/ 01 апреля 2015

Через :

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

В команде awk 'dups[$1]++' переменная $1 содержит все содержимое column1, а квадратные скобки - доступ к массиву. Таким образом, для каждого 1-го столбца строки в файле data увеличивается значение узла массива с именем dups.

И, наконец, мы циклически перебираем массив dups с num в качестве переменной и печатаем сначала сохраненные числа , а затем их дублированное значение на dups[num].

Обратите внимание, что у вашего входного файла есть пробелы в конце некоторых строк, если вы очистите их, вы можете использовать $0 вместо $1 в приведенной выше команде:)

12 голосов
/ 05 мая 2017

В окнах, использующих «Windows PowerShell» Для достижения этой цели я использовал указанную ниже команду

Get-Content .\file.txt | Group-Object | Select Name, Count

Также мы можем использовать командлет where-object для фильтрации результата

Get-Content .\file.txt | Group-Object | Where-Object { $_.Count -gt 1 } | Select Name, Count
6 голосов
/ 15 июля 2011

Предполагая, что у вас есть доступ к стандартной оболочке Unix и / или среде cygwin:

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

В основном: конвертируйте все пробелы в переносы строк, затем сортируйте транслированные выходные данные и передавайте их в uniq и считайтеповторяющиеся строки.

...