![awk 数组中的计数和求和(以及平均)](https://linux22.com/image/121227/awk%20%E6%95%B0%E7%BB%84%E4%B8%AD%E7%9A%84%E8%AE%A1%E6%95%B0%E5%92%8C%E6%B1%82%E5%92%8C%EF%BC%88%E4%BB%A5%E5%8F%8A%E5%B9%B3%E5%9D%87%EF%BC%89.png)
我有一个数据文件,其中包含日期和某些数量的相应测量值。完整的文件跨越 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 的行上执行$4
,IE其中$4
非空且非零。