Contador de Palavras no Terminal

Publicado por Mauricio Ferrari em 14/04/2021

[ Hits: 2.470 ]

Blog: https://www.youtube.com/@LinuxDicasPro

 


Contador de Palavras no Terminal



Uma das coisas que eu senti falta no Linux foi um comando que pudesse fazer a contagem de palavras de um arquivo de texto no Linux. Ao pesquisar na internet, é possível encontrar alguns scripts, mas muitos deles são longos e incompreensíveis e por isso não são muito interessantes de serem usados, pelo menos no meu caso.

Por isso resolvi desenvolver meu próprio contador de palavras. Eu queria um contador de palavras que pudesse contar as palavras do texto inteiro e de forma eficiente. Como não achei nenhum comando específico para isso, então com alguns comandos, o resultado foi esse:

#!/bin/bash

echo -e "\nNúmero de palavras: $( wc -l < <(sed "/^$/d;/^[[:punct:]]*$/d" <(tr ' ' '\n' $1)) )\n"; exit 0

Agora vamos as explicações:
  • Foi usado o comando tr para substituir todos os espaços por uma quebra de linha, assim fica uma palavra por linha.
  • Foi usado o comando sed para eliminar qualquer linha em branco e caracteres de pontuação que por acaso não estejam junto às palavras.
  • O comando wc com o parâmetro -l contou as linhas. Os comandos anteriores posicionaram uma palavra em cada linha e eliminou as que não possuíam uma palavra, o que resulta no número total de palavras.

Obs.: não deixe o caractere "!" solto no texto para evitar erros de leitura pelo comando tr.

Coloque o nome que achar mais conveniente e faça o teste para comprovar sua eficiência em poucas linhas. Como a entrada vai ser pelo comando tr, deve-se usar o carácter de direcionamento "<", conforme visto a seguir:

./palavra < documento.txt

Para exemplificação, será usado um conjunto de palavras para a demonstração da funcionalidade:

./palavra <<< "pc linux manjaro, kde xfce , shell bash - linux, mxnt ... .txz ???"

Resultado:

Número de palavras: 10

E assim, comprovamos sua eficiência. Até mais.

Outras dicas deste autor

Extraindo a Versão de um Pacote do Debian

Instalando o Java 14 no Ubuntu, Linux Mint e Debian

Avidemux QT5 no Ubuntu 20.04

Diminuindo o Tempo de Inicialização do Linux Mint

Letras Bacanas no seu Shell Script sem Figlet

Leitura recomendada

Compilar shell script

Habilitando X11 via SSH no Slackware

Problemas de tabulação no VI

Adicionando cor ao comando echo

Como mudar o teclado do Debian em uma máquina virtual configurada em outro SO

  

Comentários
[1] Comentário enviado por fabio em 14/04/2021 - 22:12h

Quando estou editando um texto no Vim e quero contar o número de palavras, uso a seguinte combinação de teclas no modo normal:

v -> g -> ctrl+g

[2] Comentário enviado por vmmello em 15/04/2021 - 12:09h

O comando wc até conta palavras com a opção -w, mas ele inclui os caracteres de pontuação como palavra.

O comando tr não tem nenhum problema com o caractere de exclamação (!). A questão é que o bash expande o caractere de exclamação para a ultima linha de comando executada, o que afeta a contagem de palavras. Talvez isso seja corrigido apenas removendo o termo $1 que parece desnecessário.

Uma forma alternativa de fazer a mesma coisa seria:
[code]
#!/bin/bash
tr -s ' ' '\n' | egrep -c -v -x '[[:punct:]]*[[:space:]]*[[:cntrl:]]*'
[/code]

[code]
$ ./conta.sh <<< "Conte cinco palavras , por favor \!\!\!"
5
[/code]

[code]
$ ./conta.sh <<< 'Conte cinco palavras , por favor !!!'
5
[/code]

[code]
$ echo 'Conte cinco palavras , por favor !!!' >/tmp/arquivo1.txt
$ ./conta.sh < /tmp/arquivo1.txt
5
[/code]

[3] Comentário enviado por maurixnovatrento em 15/04/2021 - 13:46h


[1] Comentário enviado por fabio em 14/04/2021 - 22:12h

Quando estou editando um texto no Vim e quero contar o número de palavras, uso a seguinte combinação de teclas no modo normal:

v -&gt; g -&gt; ctrl+g



Boa alternativa. Vou anotar.

[4] Comentário enviado por maurixnovatrento em 15/04/2021 - 14:07h


[2] Comentário enviado por vmmello em 15/04/2021 - 12:09h

O comando wc até conta palavras com a opção -w, mas ele inclui os caracteres de pontuação como palavra.

O comando tr não tem nenhum problema com o caractere de exclamação (!). A questão é que o bash expande o caractere de exclamação para a ultima linha de comando executada, o que afeta a contagem de palavras. Talvez isso seja corrigido apenas removendo o termo $1 que parece desnecessário.

Uma forma alternativa de fazer a mesma coisa seria:
[code]
#!/bin/bash
tr -s ' ' '\n' | egrep -c -v -x '[[:punct:]]*[[:space:]]*[[:cntrl:]]*'
[/code]

[code]
$ ./conta.sh &lt;&lt;&lt; "Conte cinco palavras , por favor \!\!\!"
5
[/code]

[code]
$ ./conta.sh &lt;&lt;&lt; 'Conte cinco palavras , por favor !!!'
5
[/code]

[code]
$ echo 'Conte cinco palavras , por favor !!!' &gt;/tmp/arquivo1.txt
$ ./conta.sh &lt; /tmp/arquivo1.txt
5
[/code]


Valeu. Parece mais eficiente. Vou adaptar sem pipe e ver o resultado. Também descobri que o ! não incomoda dentro de arquivos de textos e em aspas simples. Só dá problema em aspas duplas e o $1 não interfere em nada o !, vou evoluir meu código para suportar vários arquivos de uma vez.

Dessa sua forma também ficou boa. Mas, ele tem o mesmo sintoma com o ! como eu descrevo acima.

[5] Comentário enviado por msoliver em 17/04/2021 - 02:20h

Para coisas simples, uso o wc,
Em tarefas mais precisas:
awk '{for(n=1;n<=NF;n++) {if($n~/[[:alpha:]]{1,}/)c++;}}END{print "Palavras: "c"\nLinhas: "NR}' arquivo
Palavras: 9823
Linhas: 2601

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________


[6] Comentário enviado por maurixnovatrento em 17/04/2021 - 22:38h


[5] Comentário enviado por msoliver em 17/04/2021 - 02:20h

Para coisas simples, uso o wc,
Em tarefas mais precisas:
awk '{for(n=1;n&lt;=NF;n++) {if($n~/[[:alpha:]]{1,}/)c++;}}END{print "Palavras: "c"\nLinhas: "NR}' arquivo
Palavras: 9823
Linhas: 2601

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________




Boa alternativa em awk.

[7] Comentário enviado por maurixnovatrento em 17/04/2021 - 22:48h


[5] Comentário enviado por msoliver em 17/04/2021 - 02:20h

Para coisas simples, uso o wc,
Em tarefas mais precisas:
awk '{for(n=1;n&lt;=NF;n++) {if($n~/[[:alpha:]]{1,}/)c++;}}END{print "Palavras: "c"\nLinhas: "NR}' arquivo
Palavras: 9823
Linhas: 2601

______________________________________________________________________
Att.: Marcelo Oliver
______________________________________________________________________




Fiz alguns testes de eficiência: Deu empate com ambas as soluções, porém o seu código é mais viável para um alias. Já o meu, vou transformá-lo em algo mais complexo.

No fim, vai me servir os dois. E novamente, valeu pela sugestão. Seu código foi um aprendizado a mais para mim.





Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts