addup
|
Some programs output information in columns. The addup script totals the numbers in a column. It reads from files or standard input. For example, the lastcomm command shows CPU time used in column 4, like this: |
---|
%lastcomm tcomm
sleep tcomm __ 0.08 secs Thu Mar 27 10:23 date tcomm __ 0.08 secs Thu Mar 27 10:23 tail tcomm __ 0.09 secs Thu Mar 27 10:23 pwho tcomm __ 0.30 secs Thu Mar 27 10:23 %lastcomm tcomm | addup 4
0.550000
grep -c
(
15.8
)
outputs the number of matches after a colon (
:
) on each line. To total the matches, pipe
grep
's output through a little
sed
command to strip off the filenames and colon; have
addup
sum the output (the "first column"):
%grep -c CAUTION *.txt
abar.txt:0 applic.txt:3 badprob.txt:235 ... %grep -c CAUTION *.txt | sed 's/.*://' | addup 1
317
Here's the script:
case "$1" in [1-9]*) colnum="$1"; shift;; *) echo "Usage: `basename $0` colnum [files]" 1>&2; exit 1;; esac # Use integer output, but switch to %.4f format if "." in input. awk '{sum += $col} END {print sum}' col=$colnum OFMT='%.4f' ${1+"$@"}
The
${1+"$@"}
holds filenames (if any) from the command line and works around a
shell quoting problem (
46.7
)
. The
awk
script passes in the column through a variable on its command line, then
$col
becomes the column number. The script defaults to integer output format, without a decimal point. If it sees a "." in the input (like
1.5
), it switches to floating-point output format; the
OFMT
variable setting of
%.4f
forces
awk
to always print the result with four digits after the decimal point. (The default
OFMT
setting,
%.6g
, prints large numbers in e-notation. If you want that, delete the
OFMT='%.4f'
.)
-