我有一个包含数千个数字的文件,每个数字独占一行:
34
42
11
6
2
99
...
我正在编写一个脚本,以便打印文件中所有数字的总和。我已经有一个解决方案,但效率不高(运行需要几分钟的时间)。我正在寻找一个更高效的解决方案。有什么建议吗?
awk '{ sum += $1 } END { print sum }' numbers
这是一个 awk 脚本,用于计算名为 numbers
文件中每一行第一个字段(即第一列)的数值之和,并在处理完所有行后输出总和。
'{' 和 '}'
之间的部分是 awk 程序块。sum += $1
表示初始化或累加一个名为 sum
的变量,每次遇到新行时将该行的第一个字段(由 $1
表示)加到 sum
上。awk 自动将字段内容视为数字进行累加。END
:这是 awk 的一个特殊模式,表示在处理完所有的输入行之后执行相应的动作。{ print sum }
:这是在 END 模式下执行的动作。它打印出 sum
变量的值,也就是之前累加的所有数字的总和。因此,此命令的整体作用是从 numbers
文件中累加所有第一列的数值,并最后显示出这个总和。
paste -sd+ numbers | bc
具体说明如下:
paste
是一个在Unix/Linux系统中的命令,用于合并文件的列。-s
参数表示“串联”模式,即不按列对齐,而是将所有输入文件的内容串联成一行。-d+
参数指定了两个字段间的分隔符为 +
,这样在合并文件内容时,每行的数值会被 +
符号分隔。numbers
是一个文本文件,其中每一行包含一个单独的数值。结合上述 paste
命令的参数,它会读取 numbers
文件中的所有数值,并用 +
符号将它们连接起来形成一个算术表达式,如 1+2+3+4+5
。
bc
是一款基础计算器程序,能够处理任意精度的数学运算。paste
合成的带有 +
分隔的算术表达式字符串,并计算该表达式的结果。综上所述,整个命令的作用是将 numbers
文件中的所有数值相加求和。
逐行读取文件内容并当作数值累加求和:
s=0; while read l; do s=$((s+$l)); done < numbers; echo $s
按题主所述形式生成十万个随机整数存放到文件 random_numbers
中,然后使用 time
命令测试上述三种方式的运算耗时:
参考:
相关阅读:
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。