2016-05-27 8 views
0

10年(1995-2004)の時系列データセットを9999.00という欠損値があります。私は、欠損値を考慮せずに毎年の年間平均を計算したいと思います。シェルスクリプトを使用して閏年カレンダーの時系列から年次平均を計算します

私はコマンド

awk '!/\9999.00/{sum += $1; count++} NR%365==0{print count ? (sum) :9999.00;sum=count=0}'ifile 

しかし、私はうるう年のカレンダーを変更することができません以下と365日のカレンダーを考慮して、それを作ることができでした。また、別の列を追加する必要があります。私の欲求の出力は、たとえば

1995 annual_average 
1996 annual_average 
1997 annual_average 
.... 

ようです: 私は1995年から2000年からのデータを次のようしています。私はそれがうるう年であれば代わりに366のすべての3つのラインの代わりに、365と4線の平均を計算する必要があります。

3 
3 
4 
9999.00 
4 
9999.00 
13 
3 
9999.00 
9999.00 
9999.00 
9999.00 
9999.00 
3 
4 
2 
2 
2.6 
5.1 
4.5 

試用コマンド:

awk '!/\9999.00/{sum += $1; count++} NR%3==0{print count ? (sum) :9999.00;sum=count=0}'ifile 

欲望出力:

1995 3.33 
1996 8.5 it is a leap year, so average of 4 lines without considering missing values (4+13)/2 
1997 3 
1998 9999.00 
1999 3 
2000 3.55 leap year 
+0

366日カレンダーとはどういう意味ですか?あなたはうるう年を意味しますか?サンプルデータ入力も提供する必要があります。 – xvan

+1

[このルール](http://stackoverflow.com/a/22352190/1477064)で年が閏年かどうかを判断し、その情報を使用してNR%365をNR%366に変更することができます。私のawk fooはそれを試みるのに十分ではありません。 – xvan

+0

追加情報ありがとう@xvanしかし、私は自分のスクリプトを変更することができません。主な問題は、NR%365がNR%366に1つの時系列でどのように変化するかです。 – Kay

答えて

1

このコードはサンプルデータに有効です。

BEGIN { 
    year = 0; 
    target = 3; 
} 
$1 < 9990.00 { 
    sum += $1; 
    count++; 
} 
NR == target { 
    if (count == 0) { 
     print "9999"; 
    } else { 
     print sum/count; 
    } 
    sum = 0; 
    count = 0; 
    year++; 
    if (year % 4 == 1) { 
     target += 4; 
    } else { 
     target += 3; 
    } 
} 

ああ、非常に単純うるう年の計算はあなたが言及していない年が、いくつかの年のために失敗することに注意してください。もちろん、あなたがtarget値を調整する必要があります。

関連する問題