awk 数组中的计数和求和(以及平均)

awk 数组中的计数和求和(以及平均)

我有一个数据文件,其中包含日期和某些数量的相应测量值。完整的文件跨越 13 年,有大约 4500 个数据点——我给出了下面格式的示例。不一定每天都有测量,即某些日期对应于标题为“pbl”的数据列中的空白值。

我想计算数据集中每一年的观测值数量(即非零值的数量)以及总和。然后我会重复这一操作,但针对每个月。有点作弊,我添加了列,将完整日期缩减为“年份”和“月份年份”,以简化操作。

我正在使用 awk 并且可以正确求和。问题在于计数。目前我的 awk 行计算每年(或每月)的天数和不是观察的数量。因此,对于完整的数据集,我得到“365”或“366”,即日期列中列出的条目总数;我想要得到的是在“pbl”列中具有相应测量值的这些日期的数量。

我的预感是,我需要在某处包含一个“非零项”子句,或者依靠 4 美元而不是 2 美元,但我不知道如何做到这一点。任何提示表示赞赏!

我的代码:

awk -F, '{a[$2]++; count[$2]+=$NF}END{for (i in a) print i,a[i],count[i]}' data.csv

我的数据(样本):

“日期”、“年”、“月-年”、“pbl”

05/12/04,2004,"12-2004",960.295

06/12/04,2004,"12-2004",

13/12/04,2004,"12-2004",911.774

29/12/04,2004,"12-2004",2804.06

30/12/04,2004,"12-2004",4453.56

01/01/05,2005,"01-2005",1326.38

07/01/05,2005,"01-2005",

08/01/05,2005,"01-2005",604.919

09/01/05,2005,"01-2005",755.006

10/01/05,2005,"01-2005",

11/01/05,2005,"01-2005",978.818

12/01/05,2005,"01-2005",

13/01/05,2005,"01-2005",1644.87

29/04/05,2005,"04-2005",3630.62

30/04/05,2005,"04-2005",3780.11

01/05/05,2005,"05-2005",1262.66

02/05/05,2005,"05-2005",

14/02/06,2006,"02-2006",5667.58

15/02/06,2006,"02-2006",2696.56

23/07/07,2007,"07-2007",1276.06

24/07/07,2007,"07-2007",

答案1

您只需要处理那些值为 的行$4

awk -F, '$4 {a[$2]++; count[$2]+=$NF}END{for (i in a) print i,a[i],count[i]}' data.csv

这有效是因为

$4 {a[$2]++; count[$2]+=$NF}

导致该块仅在计算结果为 true 的行上执行$4IE其中$4非空且非零。

相关内容