awk在列中求和直到它等于N.

时间:2014-04-16 13:09:04

标签: awk

Helo,我的数据文件中包含数字,如下所示:

5.5
27.5
-3.5
5.5
22.5
1.5
26.5
-14.5
26.5
0.5
-14.5
12.5
9.5
8.5
-5.5
5.5
25.5
-22.5
19.5

我如何总结列直到它等于N,从任何带有awk的行开始? 因此,例如,我想看看是否存在来自SUMN> = 50的任何行的总和。

对于我的数据,我会得到,如果我总结1-5,1-6,1-7,2-5等行,我会得到一个大于50的总和。我需要从所有行检查所有的总和。

我尝试过以下方法:

awk '
{a[NR]=$1} 
END {
  for (i=1; i<=NR; i++) { 
    for (j=1; j<=NR; j++) {
      c+=a[i+j]
    } 
    print c; 
    c=0
  }
}' file

2 个答案:

答案 0 :(得分:1)

awk  'BEGIN{i=1;}{arr[i]=$0; i++;} END{for(j=1;j<i;j++){t=0; for(k=j;k<i;k++) {t+=arr[k];if (t>=50)print j"-"k;}}}' input.txt

输出:

1-5
1-6
1-7
1-8
1-9
1-10
1-11
1-12
1-13
1-14
1-15
1-16
1-17
1-18
1-19
2-5
2-6
2-7
2-8
2-9
2-10
2-11
2-12
2-13
2-14
2-15
2-16
2-17
2-18
2-19
3-7
3-9
3-10
3-11
3-12
3-13
3-14
3-15
3-16
3-17
3-18
3-19
4-7
4-9
4-10
4-11
4-12
4-13
4-14
4-15
4-16
4-17
4-18
4-19
5-7
5-9
5-10
5-12
5-13
5-14
5-15
5-16
5-17
5-18
5-19
6-14
6-15
6-16
6-17
6-18
6-19
7-14
7-16
7-17
7-18
7-19
8-17
8-19
9-17
9-19
12-17
12-19

作为程序文件(为了便于阅读):

BEGIN {
  i = 1;
}

{
  arr[i] = $0;
  i++;
}

END {
  for (j = 1; j < i; j++) {
    t = 0;
    for (k = j; k < i; k++) {
      t += arr[k];
      if (t >= 50)
        print j"-"k;
    }
  }
}

答案 1 :(得分:1)

为了比较,这是一个perl解决方案:

#! /usr/bin/perl

use v5.12;

my @lines=<>;
my $N=50;  

for (my $i=0; $i<=$#lines; $i++) {
    my $sum=0;
    for (my $j=$i; $j<=$#lines; $j++) {
        $sum+=$lines[$j];
        if ($sum>=$N) {
            say (($i+1)."-".($j+1)."->$sum");
        }
    }
}

./p.pl file运行此内容。