逐行相加整数的Shell命令?

1083

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

背景说明:我有一个日志文件,其中包括时间测量。通过grep相关行和一些sed重新格式化,我可以列出该文件中的所有计时。我想计算出总时间。我可以将此中间输出传输到任何命令以进行最终求和。我过去总是使用expr,但是除非它以RPN模式运行,否则我认为它无法处理这个问题(即使是在RPN模式下也很棘手)。

如何获得整数的总和?


2
这与我之前问过的一个问题非常相似:https://dev59.com/OHVC5IYBdhLWcg3wbglT - An̲̳̳drew
这个问题感觉像是一个代码高尔夫的问题。https://codegolf.stackexchange.com/ :) - Gordon Bean
47个回答

0

Miller工具对于这个任务来说绝对是过度杀伤力,但是 1)为了完整性我们把它们放在这里;2)它们可能在进一步处理中派上用场:

 % seq 10 | mlr stats1 -a sum -f 1
1_sum=55

0
一个简单的解决方案是编写一个程序来为您完成。这可能可以在Python中很快地完成,类似于:
sum = 0
file = open("numbers.txt","R")
for line in file.readlines(): sum+=int(line)
file.close()
print sum

我还没有测试过这个代码,但它看起来是正确的。只需将numbers.txt更改为文件名,将代码保存到名为sum.py的文件中,在控制台中键入"python sum.py"


调用readlines()会将整个文件读入内存 - 使用'for line in file'可能更好。 - orip

0

Rebol中的一行代码:

rebol -q --do 's: 0 while [d: input] [s: s + to-integer d] print s' < infile.txt

不幸的是,以上代码在 Rebol 3 中还不能正常工作(INPUT 无法流式传输 STDIN)。

因此,在这里提供一个临时解决方案,也适用于 Rebol 3:

rebol -q --do 's: 0 foreach n to-block read %infile.txt [s: s + n] print s'

0
#include <iostream>

int main()
{
    double x = 0, total = 0;
    while (std::cin >> x)
        total += x;
    if (!std::cin.eof())
        return 1;
    std::cout << x << '\n';
}

0
如果需要求和的数字恰好落在一个连续的范围内,你可以使用那个老套路。
   f(n) := n x ( n + 1 ) / 2

做着。
  f( high-side ) - \
  f(  low-side  - 1 )

尽管awk非常快,但直接计算仍然比求和要快得多:
注意:在没有任何大整数库的情况下,这种方法受到64位浮点精度的限制。
    ( time ( jot - 19495729 21895729 | pvE0 |

    mawk2 '{ __+=$_ } END { print __ }' )) 
    
    sleep 0.5

   ( time ( echo '19495729 21895729' | pvE0 | 

    mawk2 '
    function __(___, _) {
         return \
         _ * ((_ + (_^=_<_)) * (\
             _/= _+_)) - ___ * _ * --___ 
    }
    BEGIN {
        CONVFMT = "%.250g"
        OFS = ORS } ($!NF = __($1, $2))^_'  )) 

      in0: 20.6MiB 0:00:00 [49.4MiB/s] [49.4MiB/s] [ <=>]
  ( jot - 19495729 21895729 | pvE 0.1 in0 | mawk2 '{ __+=$_ } END { print __ }')

     0.59s user 0.03s system 141% cpu 0.440 total
     1  49669770295729 0x2D2CA503B9B1


      in0: 18.0 B 0:00:00 [ 462KiB/s] [ 462KiB/s] [<=>]
  ( echo '19495729 21895729' | pvE 0.1 in0 | mawk2 ; )

     0.00s user 0.01s system 62% cpu 0.024 total
     1  49669770295729 0x2D2CA503B9B1

** 代码将/ 2从高侧保存,以便可以执行低侧* 0.5


-1

简单的 PHP

  cat numbers.txt | php -r "echo array_sum(explode(PHP_EOL, stream_get_contents(STDIN)));"

-6

好的,以下是如何在PowerShell中完成(PowerShell核心,在Windows、Linux和Mac上都可以使用)

Get-Content aaa.dat | Measure-Object -Sum

这个问题被标记为[[shell]]:“如果没有特定的标签,应该假定使用便携式(符合POSIX标准)解决方案”,而不是PowerShell。 - retnikt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接