
私は現在、次のCSV形式を使用していますが、はるかに大きくなりましたが、今はいくつか使用しています。
EV,"Houston","-7.0"
AB,"Boston","19.0"
OO,"Mystic","13.0"
AB,"Boston","-12.0"
EN,"New York City","9.0"
2番目の列にヒューストンとボストンを含む項目のみが考慮されるように、最初の列と2番目の列を介して3番目の列のすべての正の値の平均を計算したいと思います。
出力が次のようになります。
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
あなたの出力とよりよく一致するように変更しました。
もう1つの問題は、フィールド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
「3番目の列のすべての正の値の平均を計算する」ということは、正の値のみを考慮する必要があることを意味する場合は、次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