Bash命令来总结一列数字

我想要一个bash命令,我可以pipe入这将总结一列数字。 我只是想要一个快速的class轮,将做一些基本上这样的事情:

cat FileWithColumnOfNumbers.txt | sum 

使用现有的文件:

 paste -sd+ infile | bc 

使用stdin:

 <cmd> | paste -sd+ | bc 

编辑:有了一些粘贴实现,你需要从标准input读取更明确:

<cmd> | paste -sd+ - | bc

我喜欢所选的答案。 然而,由于需要2个工具来完成这个工作,所以它往往比awk慢。

 $ wc -l file 49999998 file $ time paste -sd+ file | bc 1448700364 real 1m36.960s user 1m24.515s sys 0m1.772s $ time awk '{s+=$1}END{print s}' file 1448700364 real 0m45.476s user 0m40.756s sys 0m0.287s 

两行吗?

 awk '{ sum += $1; } END { print sum; }' "$@" 

你可以使用它,而不用多余的'猫':

 sum < FileWithColumnOfNumbers.txt sum FileWithColumnOfNumbers.txt 

FWIW:在MacOS X上,你可以用一行代码来完成:

 awk '{ sum += $1; } END { print sum; }' "$@" 

以下命令将添加所有行(awk输出的第一个字段)

 awk '{s+=$1} END {print s}' filename 

[后续ghostdog74评论]

 bash-2.03$ uname -sr SunOS 5.8 bash-2.03$ perl -le 'print for 1..49999998' > infile bash-2.03$ wc -l infile 49999998 infile bash-2.03$ time paste -sd+ infile | bc bundling space exceeded on line 1, teletype Broken Pipe real 0m0.062s user 0m0.010s sys 0m0.010s bash-2.03$ time nawk '{s+=$1}END{print s}' infile 1249999925000001 real 2m0.042s user 1m59.220s sys 0m0.590s bash-2.03$ time /usr/xpg4/bin/awk '{s+=$1}END{print s}' infile 1249999925000001 real 2m27.260s user 2m26.230s sys 0m0.660s bash-2.03$ time perl -nle' $s += $_; END { print $s } ' infile 1.249999925e+15 real 1m34.663s user 1m33.710s sys 0m0.650s 

你可以使用bc(计算器)。 假设你的#s文件被称为“n”:

 $ cat n 1 2 3 $ (cat n | tr "\012" "+" ; echo "0") | bc 6 

tr将所有换行符更改为“+”; 然后我们在最后一个加号后追加0,然后我们将expression式( 1+2+3+0 )传送给计算器

或者,如果你可以使用awk或perl,那么这里有一个Perl单线程:

 $perl -nle '$sum += $_ } END { print $sum' n 6 
 while read -r num; do ((sum += num)); done < inputfile; echo $sum 

使用for循环遍历文件…

 sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum 

如果你有ruby安装

 cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)" 
 [root@pentest3r ~]# (find / -xdev -size +1024M) | (while read a ; do aa=$(du -sh $a | cut -d "." -f1 ); o=$(( $o+$aa )); done; echo "$o";)