Text-Processing

根據csv中的幾個列條件計算awk中的平均值

  • December 9, 2019

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

引用自:https://unix.stackexchange.com/questions/556408