我想要一个可以输入的bash命令,它将汇总一列数字。我只想要一个快速的衬垫,它将做一些基本上这样的事情:
cat FileWithColumnOfNumbers.txt | sum
答案 0 :(得分:718)
paste -sd+ infile | bc
<cmd> | paste -sd+ | bc
编辑: 使用一些 paste 实现时,从 stdin 读取时需要更明确:
<cmd> | paste -sd+ - | bc
答案 1 :(得分:154)
我喜欢所选择的答案。但是,它往往比awk慢,因为需要2个工具来完成这项工作。
$ 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
答案 2 :(得分:46)
两行是否有效?
awk '{ sum += $1; }
END { print sum; }' "$@"
然后你可以在没有多余的'猫'的情况下使用它:
sum < FileWithColumnOfNumbers.txt
sum FileWithColumnOfNumbers.txt
FWIW:在MacOS X上,您可以使用单行代码进行操作:
awk '{ sum += $1; } END { print sum; }' "$@"
答案 3 :(得分:40)
以下命令将添加所有行(awk输出的第一个字段)
awk '{s+=$1} END {print s}' filename
答案 4 :(得分:16)
[ghostdog74s评论的后续]
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
答案 5 :(得分:10)
您可以使用bc(计算器)。假设您的#s文件名为“n”:
$ cat n
1
2
3
$ (cat n | tr "\012" "+" ; echo "0") | bc
6
tr
将所有换行符更改为“+”;然后我们在最后一个加号后追加0,然后我们将表达式(1+2+3+0
)传递给计算器
或者,如果你可以使用awk或perl,这里是一个Perl单行:
$perl -nle '$sum += $_ } END { print $sum' n
6
答案 6 :(得分:8)
while read -r num; do ((sum += num)); done < inputfile; echo $sum
答案 7 :(得分:4)
使用for
循环迭代您的文件...
sum=0; for x in `cat <your-file>`; do let sum+=x; done; echo $sum
答案 8 :(得分:4)
如果你安装了ruby
cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)"
答案 9 :(得分:-4)
[root@pentest3r ~]# (find / -xdev -size +1024M) | (while read a ; do aa=$(du -sh $a | cut -d "." -f1 ); o=$(( $o+$aa )); done; echo "$o";)