我有一个包含数千个数字的文件,每个数字都在自己的行上:

34
42
11
6
2
99
...

我想写一个脚本,它将打印文件中所有数字的总和。我有一个解决办法,但不是很有效。(运行需要几分钟。)我在寻找一个更有效的解决方案。有什么建议吗?


当前回答

在shell中使用awk,我使用下面的脚本来这样做:

    #!/bin/bash


total=0;

for i in $( awk '{ print $1; }' <myfile> )
do
 total=$(echo $total+$i | bc )
 ((count++))
done
echo "scale=2; $total " | bc

其他回答

cat nums | perl -ne '$sum += $_ } { print $sum'

(和brian d foy的回答一样,没有“END”)

到目前为止,没有一个解决方案使用浆糊。这里有一个:

paste -sd+ filename | bc

如果文件有一个尾随换行符,尾随+将导致语法错误。通过移除后面的+来修复错误:

paste -sd+ fiilename | sed 's/+$//g' | bc

例如,计算Σn,其中1<=n<=100000:

$ seq 100000 | paste -sd+ | bc -l
5000050000

(对于好奇的人来说,seqn会在给定正数n的情况下打印从1到n的数字序列。)

这是另一个:

open(FIL, "a.txt");

my $sum = 0;
foreach( <FIL> ) {chomp; $sum += $_;}

close(FIL);

print "Sum = $sum\n";

Perl 6

say sum lines
~$ perl6 -e '.say for 0..1000000' > test.in

~$ perl6 -e 'say sum lines' < test.in
500000500000

另一个是为了好玩

sum=0;for i in $(cat file);do sum=$((sum+$i));done;echo $sum

或者再来一次

s=0;while read l; do s=$((s+$l));done<file;echo $s

但awk解决方案可能是最好的,因为它最紧凑。