De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


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 me enviaram 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.

Adicionar comentário

* Campos obrigatórios
5000
Powered by Commentics

Comentários

Nenhum comentário ainda. Seja o primeiro!


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