Подсчитайте, сколько раз каждая строка появляется в файле

23

Скажем, у меня есть файл, который содержит:

A
A
A
B
CC

Я хочу иметь вывод, как это:

A 3
B 1
CC 1
Cheng
источник

Ответы:

23

Я понял; один из uniqвариантов -cдля «префикса строк по количеству вхождений»:

$ uniq -c
Cheng
источник
1
Обратите внимание, что номера ставятся на первое место. Если бы вы были суетливы по поводу заказа, вы могли бы сделать:uniq -c filename.txt | sed 's/[^0-9]*\\([0-9]\+\\) \\(.*\\)/\2 \1/'
безумно
12
Также обратите внимание, что он учитывает только соседние повторяющиеся строки. Распространенная идиомаsort | uniq
Стивен Д.
4
Uniq также ставит счет перед датумом. Исходный вопрос на самом деле нужно что-то вроде этого: сортировать имя файла | uniq -c | awk '{print $ 2, $ 1}'
Брюс Эдигер
В случае, если это не ясно из приведенных выше комментариев, вы должны убедиться, что данные отсортированы в первую очередь для достижения вашей цели. Если он не отсортирован, у вас будут повторные записи. Например, если вместо этого был ваш исходный файл A \ A \ A \ B \ A \ CC, вывод только uniq -cчто показывал, A 3а потом показывал A 1. Сортировка в первую очередь гарантирует, что все идентичные строки будут сгруппированы вместе
drootang
16

Я только что пришел сюда с похожей проблемой. Из этого мне удалось собрать немного более продвинутую команду, которая, я надеюсь, будет полезна для других.

Как сказал Стивен Д. в комментариях выше, uniqподсчитываются только соседние повторяющиеся строки, поэтому сначала нужно отсортировать строки. После этого мы находим уникальные строки, затем сортируем их снова, поэтому наиболее часто встречающиеся строки находятся сверху.

sort file.txt | uniq -c | sort -nr > output.txt

Вывод перенаправляется в файл output.txt. Если вы просто хотите просмотреть результаты в командной строке, удалите перенаправление и измените последнюю команду sort -nтаким образом, чтобы самая общая строка была внизу, то есть определенно все еще на экране.

DisgruntledGoat
источник
4
Вы можете заменить cat file.txt | sortпросто sort file.txt. :)
mattdm
1
@mattdm: недостатком этой формулировки является то, что вы не можете быстро заменить что- catто более интересным. Так как, вы знаете, нет cat.
SamB
1
@SamB Тогда напишите это как < file.txt sort | uniq -c. Это легко редактировать, и все же избегает ненужного cat.
HVd