Text-Processing
根據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 並且想做得更好。
正如@Archemar指出的那樣,您正在使用不同的數組鍵。我將它們更改
$1"-"$2
為更好地匹配您的輸出。另一個問題是引用了欄位 2 和 3,這對於計算來說不是那麼好,因為 field3 的值被視為零。一個快速的解決方法是
$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