Essa é praticamente a maneira mais comum de encontrar "N coisas mais comuns", exceto que você está perdendo um sort
e você tem um cat
:
tr -c '[:alnum:]' '[\n*]' < test.txt | sort | uniq -c | sort -nr | head -10
Se você não colocar um sort
antes do uniq -c
, você provavelmente obterá muitas palavras com falsos singletons. uniq
apenas executa execuções únicas de linhas, não unicidade geral.
EDIT: Eu esqueci um truque, "pare de falar". Se você está olhando para o texto em inglês (desculpe, monolíngüe norte-americano aqui), palavras como "of", "and", "the" quase sempre ocupam os dois ou três primeiros lugares. Você provavelmente quer eliminá-los. A distribuição GNU Groff tem um arquivo chamado eign
, que contém uma lista bastante decente de palavras paradas. A distro do My Arch tem /usr/share/groff/current/eign
, mas acho que também vi /usr/share/dict/eign
ou /usr/dict/eign
em antigos Unixes.
Você pode usar palavras como esta:
tr -c '[:alnum:]' '[\n*]' < test.txt |
fgrep -v -w -f /usr/share/groff/current/eign |
sort | uniq -c | sort -nr | head -10
Meu palpite é que a maioria das linguagens humanas precisa de "palavras de parada" semelhantes removidas das contagens de frequência de palavras significativas, mas não sei onde sugerir que outros idiomas parem de listar palavras.
EDIT: fgrep
deve usar o comando -w
, que ativa a correspondência de palavras inteiras. Isso evita falsos positivos em palavras que contêm apenas trabalhos curtos, como "a" ou "i".