Найти дубликаты строк в файле и подсчитать, сколько раз каждая строка была дублирована?

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

123 
123 
234 
234 
123 
345

Я хотел бы найти, сколько раз "123" было дублировано, сколько раз "234" было дублировано и т.д. Поэтому в идеале вывод будет выглядеть следующим образом:

123  3 
234  2 
345  1

Ответ 1

Предполагая, что в строке есть одно число:

sort <file> | uniq -c

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

sort <file> | uniq --count

Ответ 2

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

sort FILE | uniq -cd

или с вариантами GNU long (в Linux):

sort FILE | uniq --count --repeated

on BSD и OSX вы должны использовать grep для фильтрации уникальных строк:

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

В данном примере результатом будет:

  3 123
  2 234

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

sort FILE | uniq -c

или с вариантами GNU long (в 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

Ответ 3

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

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

или

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

Ответ 4

Через :

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

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

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

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

Ответ 5

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

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

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

Ответ 6

В окнах с использованием "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