我必须制作一个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
答案 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
}