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

34
42
11
6
2
99
...

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


当前回答

我还没有测试,但它应该工作:

cat f | tr "\n" "+" | sed 's/+$/\n/' | bc

如果bc不处理EOF和EOL,你可能必须在bc之前添加“\n”到字符串(比如通过echo)…

其他回答

在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

这是直接的Bash:

sum=0
while read -r line
do
    (( sum += line ))
done < file
echo $sum

这是另一个:

open(FIL, "a.txt");

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

close(FIL);

print "Sum = $sum\n";

Bash变体

raw=$(cat file)
echo $(( ${raw//$'\n'/+} ))

$ wc -l file
10000 file

$ time ./test
323390

real    0m3,096s
user    0m3,095s
sys     0m0,000s

这里发生了什么?读取一个文件的内容到$raw var中,然后通过将所有新行更改为“+”来从该var创建数学语句

我还没有测试,但它应该工作:

cat f | tr "\n" "+" | sed 's/+$/\n/' | bc

如果bc不处理EOF和EOL,你可能必须在bc之前添加“\n”到字符串(比如通过echo)…