você está aqui: Home  → Arquivo de Mensagens

Cálculo da soma de números em uma coluna

Colaboração: Julio Cezar Neves

Data de Publicação: 17 de abril de 2018

Uma vez apareceu na lista (excelente, por sinal) de Shell script no Yahoo um cara com a seguinte dúvida: "eu tenho um arquivo cujos campos estão separados por <TAB> e o terceiro deles possui números. Como posso calcular a soma de todos os números desta coluna do arquivo?"

Mandei a seguinte resposta:

$ echo $(cut -f3 num | tr '\n' +)0 | bc
20.1

Vamos por partes para entender melhor e primeiramente vamos ver como era o arquivo que fiz para teste:

$ cat num
a       b       3.2
a       z       4.5
w       e       9.6
q       w       2.8

Como se pode ver, está dentro do padrão do problema, onde eu tenho como terceiro campo números reais. Vamos ver o que faria a primeira parte da linha de comandos, onde eu transformo os caracteres <ENTER> (new-line) em um sinal de mais (+):

$ cut -f3 num | tr '\n' +
3.2+4.5+9.6+2.8+

Se eu mandasse desse jeito para o bc, ele me devolveria um erro por causa daquele sinal de mais (+) solto no final do texto. A minha saída foi colocar um zero no final, pois, somando zero, o resultado não se alterará. Vamos ver então como ficou:

$ echo $(cut -f3 num | tr -s '\n' +)0
3.2+4.5+9.6+2.8+0

e agora que já temos uma conta formatada, é só mandar para o nosso bc resolvê-la:

$ echo $(cut -f3 num | tr -s '\n' +)0 | bc
20.1

Isso é o que se costuma chamar de one-liner, isto é, códigos que seriam complicados em outras linguagens (normalmente seria necessário criar contadores e fazer um loop de leitura somando o terceiro campo ao contador) e em Shell são escritos em uma única linha.

Há também gente que chama isso de método KISS, que é o acrônimo de Keep It Simple Stupid. :-)

Agora vejam vocês o que é o Shell: hoje, dia 22 de agosto de 2017, 15 anos após escrever esse exemplo acima, estava revisando este capítulo do livro e imaginei um processo melhor que esse. Veja só:

$ cut -f3 num | paste -sd+
3.2+4.5+9.6+2.8

Dessa maneira eu não tenho mais o sinal de adição no fim da linha, então basta mandá-la para o bc.



Veja a relação completa dos artigos de Julio Cezar Neves

 

 

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script