Bash命令对一列数字求和

我想要一个bash命令,我可以管道将一列数字相加。我只是想要一个快速的一行程序,基本上是这样做的:

cat FileWithColumnOfNumbers.txt | sum
364759 次浏览

两行算吗?

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

然后你就可以不用多余的'cat'了:

sum < FileWithColumnOfNumbers.txt
sum   FileWithColumnOfNumbers.txt

FWIW:在MacOS X上,你可以用一行程序完成:

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

你可以用计算器。假设使用#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

使用for循环遍历你的文件…

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

使用现有文件:

paste -sd+ infile | bc

使用stdin:

<cmd> | paste -sd+ | bc
< p >编辑: 对于一些粘贴实现,在从stdin读取时需要更加显式:

<cmd> | paste -sd+ - | bc

选择使用:

-s (serial) -将所有行合并为一行

-d -使用非默认分隔符(在本例中为字符+)

while read -r num; do ((sum += num)); done < inputfile; echo $sum

我喜欢选定的答案。然而,它往往比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

[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输出的第一个字段)

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

如果你安装了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";)