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

34
42
11
6
2
99
...

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


当前回答

c++“俏皮话”:

#include <iostream>
#include <iterator>
#include <numeric>
using namespace std;

int main() {
    cout << accumulate(istream_iterator<int>(cin), istream_iterator<int>(), 0) << endl;
}

其他回答

这是另一个简单的句子

( echo 0 ; sed 's/$/ +/' foo ; echo p ) | dc

这假设数字是整数。如果你需要小数,试试

( echo 0 2k ; sed 's/$/ +/' foo ; echo p ) | dc

将2调整为所需的小数数。

另一个是为了好玩

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解决方案可能是最好的,因为它最紧凑。

sed ':a;N;s/\n/+/;ta' file|bc

我更喜欢用R来表示:

$ R -e 'sum(scan("filename"))'

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

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

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