协慌网

登录 贡献 社区

Shell 命令求和整数,每行一个?

我正在寻找一个命令,它将接受多行文本作为输入,每行包含一个整数,并输出这些整数的总和。

作为一个背景,我有一个日志文件,其中包括时间测量,所以通过 grepping 相关的行,以及一些 sed 重新格式化,我可以列出该文件中的所有时间。然而,我想计算出总数,而且我的思绪已经变得空白,因为任何命令我都可以将这个中间输出传递到最终总和。我过去总是使用expr ,但除非它在 RPN 模式下运行,否则我认为它不会应付这个问题(即使这样也会很棘手)。

我错过了什么?鉴于可能有多种方法可以实现这一点,我将很乐意阅读(并提升)任何有效的方法,即使其他人已经发布了一个不同的解决方案来完成这项工作。

相关问题: 在 Unix 上计算一列输出总和的最短命令?来自 @Andrew


更新 :哇,正如所料,这里有一些不错的答案。看起来我一定要把awk作为命令行工具进行更深入的检查!

答案

有点 awk 应该这样做吗?

awk '{s+=$1} END {print s}' mydatafile

注意:如果您要添加超过 2 ^ 31(2147483647)的任何内容,某些版本的 awk 会有一些奇怪的行为。有关更多背景,请参阅评论一个建议是使用printf而不是print

awk '{s+=$1} END {printf "%.0f", s}' mydatafile

粘贴通常合并多个文件的行,但它也可用于将文件的各行转换为单行。分隔符标志允许您将 x + x 类型方程传递给 bc。

paste -s -d+ infile | bc

或者,当从 stdin 管道时,

<commands> | paste -s -d+ - | bc

Python 中的单行版本:

$ python -c "import sys; print(sum(int(l) for l in sys.stdin))"