如何在AWK脚本中指定要打印的行?

时间:2015-09-04 19:42:06

标签: printing awk line sequence

我必须制作一个awk脚本,其中包含连续3天发生的事件,我有一个列有天和一个列有几个月,我正在测试它们来分析序列,我不知道如何打印线条。这就是我所拥有的:

BEGIN{
    count=0;
    dia=0;

}

{
    day=$2; 
    month=$3;

    if(dia==31 && day==1 && month==02 || month==04 || month==06 || month==09 || month==11){
        count+=1
    }
    else if(dia==30 && day==1 && month==03 || month==05 || month==07 || month==08 || month==10 || month==12){
        count+=1
    }
    else if(dia==28 && day==1 && month==03){
        count+=1
    }
    else if(day==dia+1){
        count+=1;
    }
    else {
        count=0;
    }
    if(count==3){
        for(i=NR-4;i<=NR;i++){
            print ??? (line i)
        }
        count=0;
    }
    dia=day;
}

我想用数组制作东西,但我相信如果我能用这些方式打印它会更容易。

我的输入数据是这样的文件:

  

83032 18 07 0000 -99 20.4 -99 7.6 6.88
  83032 27 08 0000 -99 30.6 -99 6.1 21
  83037 29 06 0000 -99 20.4 -99 4.9 11.12
  83037 30 06 0000 -99 18.7 -99 0.5 11.2
  83037 01 07 0000 -99 33.5 -99 7.7 24
  83037 05 07 0000 -99 23.3 -99 10.1 11.28
  83037 17 07 0000 -99 21.1 -99 10.2 11.1
  83037 18 07 0000 -99 20.7 -99 7.1 11.26

我想只拍摄连续3天(第2列)的行,输出如下:

  

83037 29 06 0000 -99 20.4 -99 4.9 11.12
  83037 30 06 0000 -99 18.7 -99 0.5 11.2
  83037 01 07 0000 -99 33.5 -99 7.7 24

1 个答案:

答案 0 :(得分:2)

也许你可以建立在此之上。如果连续三次发生打印缓冲的行,则计算与前一个相比的日期数。请注意,这也不健壮,您也可能需要按第一个标识符字段进行分组,因为日期可能在一个组中有效。还需要考虑闰年。无论如何,对于给定的输入,这是有效的

BEGIN {                                              # days in months
   split("31,28,31,30,31,30,31,31,30,31,30,31", m, ",")
}
{
   n = $2 + 0                                        # calculate day num
   for (i = 1; i < $3 + 0; i++) {
      n += m[i]
   }
}

p + 1 == n {                                         # if next value
   c++                                               # increment counter
   a[c] = $0                                         # save record 
}

{ p = n }                                            # set to previous

c == 3  {                                            # print rows if reached target
   for (i = 1; i <= c; i++) {
      print a[i]
   }
   delete a                                          # clear for next round
   c = 0
}