![计算多年来每天的平均值](https://linux22.com/image/92759/%E8%AE%A1%E7%AE%97%E5%A4%9A%E5%B9%B4%E6%9D%A5%E6%AF%8F%E5%A4%A9%E7%9A%84%E5%B9%B3%E5%9D%87%E5%80%BC.png)
我有一些“CSV”数据(实际上用作;
分隔符),从 1971-01-01 到 2099-12-31(跨度为 2099−1971=128 年)每天都有一行。数据组织如下:
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
有了这些数据,我需要计算所有年份中每个日历日(一年 365 个日历日)的平均值(因此保留月份和日期以及多年来的平均值)。例如,由于数据跨度从 1971 年到 2100 年,因此我有 01-01(1 月 1 日)的 128 个数据点。我想计算 1 月 1 日这 128 个值的平均值(即 1971-01-01、1972-01-01、...、2099-01-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
.或者您可以简单地通过外部排序来管道输出。