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";)