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


23

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

A
A
A
B
CC

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

A 3
B 1
CC 1

Ответы:


23

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

$ uniq -c

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таким образом, чтобы самая общая строка была внизу, то есть определенно все еще на экране.


4
Вы можете заменить cat file.txt | sortпросто sort file.txt. :)
mattdm

1
@mattdm: недостатком этой формулировки является то, что вы не можете быстро заменить что- catто более интересным. Так как, вы знаете, нет cat.
SamB

1
@SamB Тогда напишите это как < file.txt sort | uniq -c. Это легко редактировать, и все же избегает ненужного cat.
HVd
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.