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"

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

おすすめ記事