我目前有以下 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