Linux команда или скрипт подсчитывают повторяющиеся строки в текстовом файле? - PullRequest
103 голосов
/ 23 июня 2011

Если у меня есть текстовый файл со следующим содержанием

red apple
green apple
green apple
orange
orange
orange

Существует ли команда или сценарий Linux, которые я могу использовать для получения следующего результата?

1 red apple
2 green apple
3 orange

Ответы [ 7 ]

197 голосов
/ 23 июня 2011

Отправьте его через sort (чтобы соединить смежные элементы), а затем uniq -c, чтобы подсчитать, т. Е .:

sort filename | uniq -c

и получить этот список в отсортированном порядке (по частоте) вы можете

sort filename | uniq -c | sort -nr
46 голосов
/ 15 апреля 2014

Почти то же самое, что и borribles ', но если вы добавите параметр d к uniq, он покажет только дубликаты.

sort filename | uniq -cd | sort -nr
6 голосов
/ 23 июня 2011

uniq -c file

и если файл еще не отсортирован:

sort file | uniq -c

3 голосов
/ 23 июня 2011

Попробуйте это

cat myfile.txt| sort| uniq
2 голосов
/ 23 июня 2011
cat <filename> | sort | uniq -c
2 голосов
/ 23 июня 2011

Можете ли вы жить с упорядоченным списком в алфавитном порядке:

echo "red apple
> green apple
> green apple
> orange
> orange
> orange
> " | sort -u 

?

green apple
orange
red apple

или

sort -u FILE

-u означает уникальность и уникальностьдостигается только путем сортировки.

Решение, которое сохраняет порядок:

echo "red apple
green apple
green apple
orange
orange
orange
" | { old=""; while read line ; do   if [[ $line != $old ]]; then  echo $line;   old=$line; fi ; done }
red apple
green apple
orange

и с файлом

cat file | { 
old=""
while read line
do
  if [[ $line != $old ]]
  then
    echo $line
    old=$line
  fi
done }

Последние два удаляют только дубликаты, которыеследуйте немедленно - что соответствует вашему примеру.

echo "red apple
green apple
lila banana
green apple
" ...

Напечатает два яблока, разделенных бананом.

0 голосов
/ 23 июня 2011

Чтобы получить счет:

$> egrep -o '\w+' fruits.txt | sort | uniq -c

      3 apple
      2 green
      1 oragen
      2 orange
      1 red

Чтобы получить отсортированный счет:

$> egrep -o '\w+' fruits.txt | sort | uniq -c | sort -nk1
      1 oragen
      1 red
      2 green
      2 orange
      3 apple

EDIT

Ага, это НЕ было в границах слов, мой плохой. Вот команда, используемая для полных строк:

$> cat fruits.txt | sort | uniq -c | sort -nk1
      1 oragen
      1 red apple
      2 green apple
      2 orange
...