2017-04-12 7 views
0

期間の間のレコード数を数えようとしています。それは、変数をインクリメントする必要がありたびに日付が変わるawkを使用した変数の自動インクリメント

doa 
19560227 
19560429 
19571001 
19571201 
19580301 
. 
. 
. 
. 
20170327 
20170401 

期間は

19560101 to 19561231 
19570101 to 19571231 
. 
. 
. 
20170101 to 20171231 

のようなカレンダー年の間にあります。 次のコードを試しましたが、結果を取得できませんでした。

awk '{ 
    doa=$1 
    cnt=1956 

    for (i=19560101; i<=20171231; i=i+10000){ 
    if(doa >=i && doa <= i+1130){year${cnt}+=1} 
    } 

    print year${cnt} 
    cnt+=1 
}' 

助けてください。このよう

+1

の予想される出力を? –

答えて

0

?:範囲として

$ awk '{a[substr($i,1,4)]++}END{for(i in a) print i, a[i]}' file 
1956 2 
doa 1 
. 4 
1957 2 
1958 1 
2017 2 

は暦年あり、それは年を数えるのに十分ではないでしょうか?そうでない場合は、以下の私のコメントを参照してください。

あなたが全範囲を出力したい場合は、printでそれを行う:

print i "0101 to " i "1231", a[i] 

出力

19560101 to 19561231 2 
... 
+0

ありがとうございました。しかし、暦年でなければ、どのように進めていくのですか?期間が19560401〜19570331であり、そこにあるとします。 – var

+0

@var '{if(substr($ i、5,4)> =" 0401 ")a [substr($ i、1,4)] ++ ;そうでなければ[substr($ i、1,4)-1] ++} '(テストされていない、固定された> to> =、あなた)。 –

関連する問題