Shortest command to calculate the sum of a column of output on Unix? Shortest command to calculate the sum of a column of output on Unix? shell shell

Shortest command to calculate the sum of a column of output on Unix?


ipcs -mb | tail +4 | awk '{ sum += $7 } END { print sum }'

Or without tail:

ipcs -mb | awk 'NR > 3 { sum += $7 } END { print sum }'

Using awk with bc to have arbitrary long results (credits to Jouni K.):

ipcs -mb | awk 'NR > 3 { print $7 }' | paste -sd+ | bc


I would try to construct a calculation string and feed it to bc as follows:

  1. grep the lines that contain the numbers
  2. sed away all characters before (and after) the number on each line
  3. xargs the result (to get a string of numbers separated by blanks)
  4. tr anslate the blanks to '+' characters
  5. good appetite bc!

ipcs -mb | grep -w '^m ' | sed 's/^.*\s//' | xargs | tr ' ' + | bc

Looks like this is slightly longer than the awk solution, but for everyone who can't read (and understand) the odd awk code this may be easier to grasp... :-)

If bc is not installed you can use double parentheses in step 5 above to calculate the result:

  • echo $(( $(ipcs -mb | grep -w '^m ' | sed 's/^.*\s//' | xargs | tr ' ' +) )) or
  • SUM=$(( $(ipcs -mb | grep -w '^m ' | sed 's/^.*\s//' | xargs | tr ' ' +) )) or
  • (( SUM=$(ipcs -mb | grep -w '^m ' | sed 's/^.*\s//' | xargs | tr ' ' +) ))

The spacing after and before the double parentheses is optional.


I have a utility script which simply adds up all columns. It's usually easy enough to grab the one you want from the one-line output. As a bonus, some SI-suffixes are recognized.

#!/usr/bin/awk -f# Sum up numerical values by column (white-space separated)## Usage:  $0 [file ...]## stern, 1999-2005{    for(i = 1; i <= NF; ++i) {        scale = 1        if ($i ~ /[kK]$/) { scale = 1000 }        if ($i ~ /[mM]$/) { scale = 1000*1000 }        if ($i ~ /[gG]$/) { scale = 1000*1000*1000 }        col[i] += scale * $i;    }    if (NF > maxnf) maxnf = NF;}END {    for(i = 1; i <= maxnf; ++i) { printf " %.10g", col[i] }    print "";}

Example with custom field separator:

$ head /etc/passwd | addcol -F:0 0 45 39 0 0 0