2015-09-04 104 views
0

我必須製作一個awk腳本,用於處理連續3天發生的事件,我有一個包含日期和列的月份列,我正在測試它們以分析序列,並且我不知道如何打印線。這是我有什麼:如何在AWK腳本中指定要打印的行?

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 -99 20.4 7.6 6.88
83032 27 08 0000 -99 -99 30.6 6.1 21
06 0000 -99 20.4 -99 4.9 11.12
06 0000 -99 -99 18.7 0.5 11.2
07 0000 -99 -99 33.5 7.7 24
83037 05 07 0000 -99 -99 23.3 10.1 11.28
83037 17 07 0000 -99 -99 21.1 10.2 11.1
83037 18 07 0000 -99 -99 20.7 7.1 11.26

,我想僅舉具有連續3天(第2列)線,使這樣的輸出:

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

+0

編輯您的問題,包括清晰,準確,可測試的樣本輸入和預期輸出。你的腳本有一個名爲'dia'和'''的變量 - 是一個錯字,它應該是一個變量嗎?如果不是,他們是什麼意思?你有(或可以得到)GNU awk(試試'awk --version')? –

+0

如果我理解你正在嘗試做的正確事情,將日/月轉換爲序列號並對一個單調序列進行不間斷的序列/間隙分析可能會更容易。 – karakfa

+0

@karakfa我不知道你提到的功能和過程,我如何將它應用到我的腳本中? – lazzari26

回答

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 
} 
+0

哦......謝謝。有效。我改變了一點,因爲我的數據比我顯示的數據大,所以我必須爲計數器設置c = 0,以查找其他模式。再見。 – lazzari26

+0

@lazzari26作爲對答案作者的禮貌,您至少應該a)upvote並b)接受它(通過點擊答案旁邊的複選標記)。 –