根据csv中的几个列条件计算awk的平均值

根据csv中的几个列条件计算awk的平均值

我目前有以下 csv 格式,它要大得多,但我现在已经使用了其中的一部分。

EV,"Houston","-7.0"
AB,"Boston","19.0"
OO,"Mystic","13.0"
AB,"Boston","-12.0"
EN,"New York City","9.0"

我想通过第一列和第二列计算第三列的所有正值的平均值,以便仅考虑第二列中具有休斯顿和波士顿的条目。

我希望输出是这样的:

The average of AB-Boston is 19
The average of EV-Houston is 0

到目前为止我已经尝试过了,但这根本不是一个好的尝试。

awk -F, '{airline[$1$2]+=$3;++count[$1]}END{for (key in airline) print "Average of",key,"is",airline[key]/count[key]}' file

我已经用 python 编写了一个解决方案,但我不习惯 bash,并且希望做得更好。

答案1

作为@Archemar指出,您正在使用不同的数组键。我将它们更改为$1"-"$2更好地匹配您的输出。

另一个问题是字段 2 和字段 3 被引用,这不利于计算,因为字段 3 的值被视为零。快速解决方法是将所有引号替换$0为空字符串。

awk -F',' '{
  gsub(/"/, "")
  airline[$1"-"$2]+=$3
  ++count[$1"-"$2]
}
END {
  for (key in airline) print "Average of",key,"is",airline[key]/count[key]
}' file

输出:

Average of EN-New York City is 9
Average of AB-Boston is 3.5
Average of EV-Houston is -7
Average of OO-Mystic is 13

如果“计算第三列的所有正值的平均值”意味着只应考虑正值,则添加if如下语句。我不完全确定这是否是您想要的。

awk -F',' '{
  gsub(/"/, "")
  if ($3>0) {
    airline[$1"-"$2]+=$3
    ++count[$1"-"$2]
  }
}
END {
  for (key in airline) print "Average of",key,"is",airline[key]/count[key]
}' file

输出:

Average of EN-New York City is 9
Average of AB-Boston is 19
Average of OO-Mystic is 13

相关内容