Shortest command to calculate the sum of a column of output on Unix?
I would try to construct a calculation string and feed it to bc as follows:
- grep the lines that contain the numbers
- sed away all characters before (and after) the number on each line
- xargs the result (to get a string of numbers separated by blanks)
- tr anslate the blanks to '+' characters
- 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 ' ' +) ))
orSUM=$(( $(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