How can I sum numbers on lines in a file

bc with a little help from paste to get the lines in a single one with + as the separator:

paste -sd+ file.txt | bc

To use the output of grep (or any other command) instead a static file, pass the grep's STDOUT to the STDIN of paste:

grep .... | paste -sd+ | bc

Example:

% cat file.txt            
1
3
4
1
4
3
1
2

% paste -sd+ file.txt | bc
19

% grep . file.txt | paste -sd+ | bc
19

If you must use bash, then you can use an array to save the file contents and then iterate over the elements or you can read the file line by line and do the sum for each line, the second approach would be more efficient:

$ 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

You could use awk, too. To count the total number of lines in *.txt files that contain the word "hello":

grep -ch 'hello' *.txt | awk '{n += $1}; END{print n}'

To simply sum the numbers in a file:

awk '{n += $1}; END{print n}' file.txt

Use numsum from the package num-utils!

(You may need to sudo apt-get install num-utils)

The command numsum does just what you need by default;

$ numsum file.txt 
19

Reading the test numbers line by line from stdin:

$ printf '
1 
3
4
1
4
3
1
2' | numsum
19

Or reading from one line:

$ printf '1 3 4 1 4 3 1 2' | numsum -r
19

More utilities

The package contains some other utilities for number processing that deserve to be more well known:

numaverage   - find the average of the numbers, or the mode or median
numbound     - find minimum of maximum of all lines
numgrep      - to find numbers matching ranges or sets
numinterval  - roughly like the first derivative
numnormalize - normalize numbers to an interval, like 0-1
numrandom    - random numbers from ranges or sets, eg odd.  
numrange     - similar to seq
numround     - round numbers up, down or to nearest

and a more general calculator command numprocess,
that applies an expression from the command line to numbers on input lines.

Tags:

Bash

Files