;
1971-01-01から2099-12-31(2099-1971 = 128年)まで、毎日1行ずつ含まれる一部の「CSV」データ(実際に区切り文字として使用されます)があります。データは次のように構成されます。
YEAR;MONTH;DAY;RES1;RES2
1971;1;1;1206.1;627
1971;1;2;1303.4;654.3
1971;1;3;1248.9;662
1971;1;4;1188.8;666.8
1971;1;5;1055.2;667.8
1971;1;6;987.1;663.3
1971;1;7;939.2;655.1
1971;1;8;883.2;644.4
︙
2099;12;29;791.7;664.3
2099;12;30;746.7;646.4
2099;12;31;706.8;629.3
このデータを使用して、すべての年(1年に365日)にわたって各カレンダーの日付の平均を計算する必要があります(したがって、月と日付、および年の平均も維持する必要があります)。たとえば、データ範囲は1971年から2100年までであるため、01-01(1月1日)のデータポイントは128です。 1月1日にこの128の値の平均を計算したいと思います(つまり、1971-01-01、1972-01-01、...、2099-01-01日の値)。 02(1月2日)から12~31日(12月31日)まで続きます。したがって、必要な出力には次のように365日を含める必要があります。
MONTH;DAY;RES1;RES2
1;1;AVERAGE_1.1_RES1;AVERAGE_1.1_RES2
1;2;AVERAGE_1.2_RES1;AVERAGE_1.2_RES2
1;3;AVERAGE_1.3_RES1;AVERAGE_1.3_RES2
1;4;AVERAGE_1.4_RES1;AVERAGE_1.4_RES2
1;5;AVERAGE_1.5_RES1;AVERAGE_1.5_RES2
1;6;AVERAGE_1.6_RES1;AVERAGE_1.6_RES2
1;7;AVERAGE_1.7_RES1;AVERAGE_1.7_RES2
︙
12;29;AVERAGE_12.29_RES1;AVERAGE_12.29_RES2
12;30;AVERAGE_12.30_RES1;AVERAGE_12.30_RES2
12;31;AVERAGE_12.31_RES1;AVERAGE_12.31_RES2
どうすればいいですか?
答え1
長年にわたって毎日平均したい場合は、次のことができます。
awk -F\; '
NR>1 {
sum1[$2";"$3]+=$4; sum2[$2";"$3]+=$5; n[$2";"$3]++;
}
END {
printf "MONTH;DAY;RES1;RES2\n";
for (i in n) printf "%s;%.1f;%.1f\n", i, sum1[i]/n[i], sum2[i]/n[i]
}' file.csv
配列をソートしない限り、出力順序は保証されません。最も便利な方法はユーザーの順序によって異なりますawk
。あるいは、単に外部整列を介して出力をパイプすることもできます。