前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何快速计算文件中所有数字的总和?

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

原创
作者头像
程序熵
发布2024-04-05 22:12:58
1130
发布2024-04-05 22:12:58
举报
文章被收录于专栏:技术汇技术汇

问题:

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

代码语言:txt
复制
34
42
11
6
2
99
...

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


答案:

使用 awk 命令

代码语言:bash
复制
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 命令

代码语言:bash
复制
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 文件中的所有数值相加求和。

使用笨办法

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

代码语言:bash
复制
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

相关阅读:

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题:
  • 答案:
    • 使用 awk 命令
      • 使用 paste 跟 bc 命令
        • 使用笨办法
          • 效率对比
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档