我有一个包含数千个数字的文件,每个数字都在自己的行上:
34
42
11
6
2
99
...
我想写一个脚本,它将打印文件中所有数字的总和。我有一个解决办法,但不是很有效。(运行需要几分钟。)我在寻找一个更有效的解决方案。有什么建议吗?
我有一个包含数千个数字的文件,每个数字都在自己的行上:
34
42
11
6
2
99
...
我想写一个脚本,它将打印文件中所有数字的总和。我有一个解决办法,但不是很有效。(运行需要几分钟。)我在寻找一个更有效的解决方案。有什么建议吗?
当前回答
Perl 6
say sum lines
~$ perl6 -e '.say for 0..1000000' > test.in
~$ perl6 -e 'say sum lines' < test.in
500000500000
其他回答
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创建数学语句
这是直接的Bash:
sum=0
while read -r line
do
(( sum += line ))
done < file
echo $sum
只是为了好玩,让我们用PDL (Perl的数组数学引擎)来做!
perl -MPDL -E 'say rcols(shift)->sum' datafile
rcols将列读入矩阵(在本例中为1D), sum (surprise)对矩阵中的所有元素求和。
用+替换所有的新行,加一个0并把它发送给Ruby解释器不是更容易吗?
(sed -e "s/$/+/" file; echo 0)|irb
如果你没有irb,你可以把它发送到bc,但是你必须删除所有的换行符,除了最后一个(echo)。最好使用tr,除非您拥有sed的博士学位。
(sed -e "s/$/+/" file|tr -d "\n"; echo 0)|bc
我还没有测试,但它应该工作:
cat f | tr "\n" "+" | sed 's/+$/\n/' | bc
如果bc不处理EOF和EOL,你可能必须在bc之前添加“\n”到字符串(比如通过echo)…