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

34
42
11
6
2
99
...

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


当前回答

$ perl -MList::Util=sum -le 'print sum <>' nums.txt

其他回答

考虑到你需要通读整个文件,我不知道你是否能找到比这更好的。

$sum = 0;
while(<>){
   $sum += $_;
}
print $sum;

tcl中的一个:

#!/usr/bin/env tclsh
set sum 0
while {[gets stdin num] >= 0} { incr sum $num }
puts $sum

你可以使用awk:

awk '{ sum += $1 } END { print sum }' file

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创建数学语句

另一个选择是使用jq:

$ seq 10|jq -s add
55

-s(——slurp)将输入行读入数组。