Получить количество вхождений каждого слова в документе

Получить количество вхождений каждого слова в документе

Как узнать количество слов в файле?

Мне нужна гистограмма каждого слова в текстовом конвейере или документе. Новая строка и пустые строки будут существовать в документе. Я удалил все, кроме [a-zA-Z].

> cat doc.txt 
word second third 

word really
> cat doc.txt | ... # then count occurrences of each word \
                    # and print in descending order separated by delimiter
word 2
really 1
second 1
third 1

Он должен быть достаточно эффективным, поскольку файл представляет собой текст размером 1 ГБ и не может работать с экспоненциальной загрузкой.

решение1

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

grep -o '\w*' doc.txt | sort | uniq -c | sort -nr
  • -oПечатать каждое совпадение вместо соответствующих строк
  • \w*Сопоставьте символы слова
  • sortсортируем совпадения перед отправкой по конвейеру uniq.
  • uniq -cвывести уникальные строки и количество вхождений-c
  • sort -nrОбратная сортировка по количеству вхождений.

Выход:

  2 word
  1 third
  1 second
  1 really

Альтернатива:

awkДля точного вывода используйте :

$ grep -o '\w*' doc.txt \
| awk '{seen[$0]++} END{for(s in seen){print s,seen[s]}}' \
| sort -k2r

word 2
really 1
second 1
third 1

решение2

perl -lnE '
  $count{$_}++ for /[[:alpha:]]+/g;
  END {
    say "@$_" for
      sort {$b->[1] <=> $a->[1] || $a->[0] cmp $b->[0]}
      map {[$_, $count{$_}]}
      keys %count
  }
' doc.txt

Это потребует гораздо больше памяти, чем первоначальное решение pLumo.

Связанный контент