bc
com uma pequena ajuda de paste
para obter as linhas em uma única com +
como separador:
paste -sd+ file.txt | bc
Para usar a saída de grep
(ou qualquer outro comando) em vez de um arquivo estático, passe o STDOUT de grep
para o STDIN de paste
:
grep .... | paste -sd+ | bc
Exemplo:
% cat file.txt
1
3
4
1
4
3
1
2
% paste -sd+ file.txt | bc
19
% grep . file.txt | paste -sd+ | bc
19
Se você precisar usar bash
, poderá usar uma matriz para salvar o conteúdo do arquivo e, em seguida, iterar os elementos ou ler o arquivo linha por linha e fazer a soma de cada linha, a segunda abordagem mais eficiente:
$ time { nums=$(<file.txt); for i in ${nums[@]}; do (( sum+=i )); done; echo $sum ;}
19
real 0m0.002s
user 0m0.000s
sys 0m0.000s
$ time { while read i; do (( sum+=i )); done <file.txt; echo $sum ;}
19
real 0m0.000s
user 0m0.000s
sys 0m0.000s