Obtenha a contagem de ocorrências de cada palavra no documento

Obtenha a contagem de ocorrências de cada palavra no documento

Como posso encontrar a contagem de cada palavra em um arquivo?

Quero um histograma de cada palavra no tubo de texto ou documento. Nova linha e linhas vazias existirão no documento. Eu tirei tudo, exceto [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

Ele precisa ser um tanto eficiente, pois o arquivo tem texto de 1 GB e não pode funcionar com carga de tempo exponencial.

Responder1

Experimente isto:

grep -o '\w*' doc.txt | sort | uniq -c | sort -nr
  • -oImprima cada correspondência em vez de linhas correspondentes
  • \w*Combine caracteres de palavras
  • sortclassifique as correspondências antes de canalizar para uniq.
  • uniq -cimprima as linhas únicas e o número de ocorrências-c
  • sort -nrClassificação reversa por número de ocorrências.

Saída:

  2 word
  1 third
  1 second
  1 really

Alternativa:

Use awkpara a saída exata:

$ 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

Responder2

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

Isso consumirá muito mais memória do que a solução inicial do pLumo.

informação relacionada