如何快速计算文件中所有数字的总和?

问题:

我有一个包含数千个数字的文件,每个数字独占一行:

34
42
11
6
2
99
...

我正在编写一个脚本,以便打印文件中所有数字的总和。我已经有一个解决方案,但效率不高(运行需要几分钟的时间)。我正在寻找一个更高效的解决方案。有什么建议吗?


答案:

使用 awk 命令

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

这是一个 awk 脚本,用于计算名为 numbers 文件中每一行第一个字段(即第一列)的数值之和,并在处理完所有行后输出总和。

  • '{' 和 '}' 之间的部分是 awk 程序块。
  • sum += $1 表示初始化或累加一个名为 sum 的变量,每次遇到新行时将该行的第一个字段(由 $1 表示)加到 sum 上。awk 自动将字段内容视为数字进行累加。
  • END:这是 awk 的一个特殊模式,表示在处理完所有的输入行之后执行相应的动作。
  • { print sum }:这是在 END 模式下执行的动作。它打印出 sum 变量的值,也就是之前累加的所有数字的总和。

因此,此命令的整体作用是从 numbers 文件中累加所有第一列的数值,并最后显示出这个总和。

使用 paste 跟 bc 命令

paste -sd+ numbers | bc

具体说明如下:

  1. paste

    • paste 是一个在Unix/Linux系统中的命令,用于合并文件的列。
    • -s 参数表示“串联”模式,即不按列对齐,而是将所有输入文件的内容串联成一行。
    • -d+ 参数指定了两个字段间的分隔符为 +,这样在合并文件内容时,每行的数值会被 + 符号分隔。
  2. numbers

    • 这里 numbers 是一个文本文件,其中每一行包含一个单独的数值。

结合上述 paste 命令的参数,它会读取 numbers 文件中的所有数值,并用 + 符号将它们连接起来形成一个算术表达式,如 1+2+3+4+5

  1. | (管道符号):

    • 管道符号用于将前一个命令的输出作为后一个命令的输入。
  2. bc

    • bc 是一款基础计算器程序,能够处理任意精度的数学运算。
    • 它接收通过管道传来的由 paste 合成的带有 + 分隔的算术表达式字符串,并计算该表达式的结果。

综上所述,整个命令的作用是将 numbers 文件中的所有数值相加求和。

使用笨办法

逐行读取文件内容并当作数值累加求和:

s=0; while read l; do s=$((s+$l)); done < numbers; echo $s

效率对比

按题主所述形式生成十万个随机整数存放到文件 random_numbers 中,然后使用 time 命令测试上述三种方式的运算耗时:

在这里插入图片描述


参考:

  • stackoverflow question 2702564
  • man awk
  • man paste
  • man bc

相关阅读:

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值