我想要一个bash命令,我可以管道将一列数字相加。我只是想要一个快速的一行程序,基本上是这样做的:
cat FileWithColumnOfNumbers.txt | sum
我想要一个bash命令,我可以管道将一列数字相加。我只是想要一个快速的一行程序,基本上是这样做的:
cat FileWithColumnOfNumbers.txt | sum
当前回答
下面的命令将添加所有行(awk输出的第一个字段)
awk '{s+=$1} END {print s}' filename
其他回答
如果你安装了ruby
cat FileWithColumnOfNumbers.txt | xargs ruby -e "puts ARGV.map(&:to_i).inject(&:+)"
使用现有文件:
paste -sd+ infile | bc
使用stdin:
<cmd> | paste -sd+ | bc
编辑: 对于一些粘贴实现,你需要更明确地从stdin读取:
<cmd> |粘贴-sd+ - | BC
选择使用:
-s (serial) -将所有行合并为一行 -d -使用非默认分隔符(在本例中为字符+)
[root@pentest3r ~]# (find / -xdev -size +1024M) | (while read a ; do aa=$(du -sh $a | cut -d "." -f1 ); o=$(( $o+$aa )); done; echo "$o";)
[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
两行算吗?
awk '{ sum += $1; }
END { print sum; }' "$@"
然后你就可以不用多余的'cat'了:
sum < FileWithColumnOfNumbers.txt
sum FileWithColumnOfNumbers.txt
FWIW:在MacOS X上,你可以用一行程序完成:
awk '{ sum += $1; } END { print sum; }' "$@"