我有一个包含数千个数字的文件,每个数字都在自己的行上:
34
42
11
6
2
99
...
我想写一个脚本,它将打印文件中所有数字的总和。我有一个解决办法,但不是很有效。(运行需要几分钟。)我在寻找一个更有效的解决方案。有什么建议吗?
我有一个包含数千个数字的文件,每个数字都在自己的行上:
34
42
11
6
2
99
...
我想写一个脚本,它将打印文件中所有数字的总和。我有一个解决办法,但不是很有效。(运行需要几分钟。)我在寻找一个更有效的解决方案。有什么建议吗?
当前回答
我更喜欢用R来表示:
$ R -e 'sum(scan("filename"))'
其他回答
另一个是为了好玩
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解决方案可能是最好的,因为它最紧凑。
用+替换所有的新行,加一个0并把它发送给Ruby解释器不是更容易吗?
(sed -e "s/$/+/" file; echo 0)|irb
如果你没有irb,你可以把它发送到bc,但是你必须删除所有的换行符,除了最后一个(echo)。最好使用tr,除非您拥有sed的博士学位。
(sed -e "s/$/+/" file|tr -d "\n"; echo 0)|bc
这是另一个:
open(FIL, "a.txt");
my $sum = 0;
foreach( <FIL> ) {chomp; $sum += $_;}
close(FIL);
print "Sum = $sum\n";
在去:
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
sum := int64(0)
for scanner.Scan() {
v, err := strconv.ParseInt(scanner.Text(), 10, 64)
if err != nil {
fmt.Fprintf(os.Stderr, "Not an integer: '%s'\n", scanner.Text())
os.Exit(1)
}
sum += v
}
fmt.Println(sum)
}
C总是以速度取胜:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv) {
ssize_t read;
char *line = NULL;
size_t len = 0;
double sum = 0.0;
while (read = getline(&line, &len, stdin) != -1) {
sum += atof(line);
}
printf("%f", sum);
return 0;
}
1M数字的计时(与我的python答案相同的机器/输入):
$ gcc sum.c -o sum && time ./sum < numbers
5003371677.000000
real 0m0.188s
user 0m0.180s
sys 0m0.000s