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.
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
.
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários