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

How do I specify a line to print in an AWK script?

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

BEGIN{
    count=0;
    dia=0;

}

{
    day=; 
    month=;

    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

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

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

p + 1 == n {                                         # if next value
   c++                                               # increment counter
   a[c] = [=10=]                                         # 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
}