
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
-o
Imprima cada correspondência em vez de linhas correspondentes\w*
Combine caracteres de palavrassort
classifique as correspondências antes de canalizar parauniq
.uniq -c
imprima as linhas únicas e o número de ocorrências-c
sort -nr
Classificação reversa por número de ocorrências.
Saída:
2 word
1 third
1 second
1 really
Alternativa:
Use awk
para 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.