複数の列にグループ化AWK

複数の列にグループ化AWK

CSVファイルがあります。

country,gender,sport,height,weight,gold,silver
ESP,male,football,1.8,84,0,1
VEN,female,handball,1.6,59,1,0
ESP,male,athletics,1.7,65,0,0

キーと体重の最大値、最小値、平均値とパラメータに示されている国別、性別別にグループ化された金銀熱の合計を出力するスクリプトをawkを使用して作成する必要があります。

実行時間:

gawk -f script3_4.awk -v sport=football sex=male athletes.csv

出力は次のようになります。

country,gender,maxH,minH,avgH,maxW,minW,avgW,sum_medals
ESP,male,1.98,1.73,1.86,70,120,85,7
BRA,male,1.94,1.65,1.7,65,112,91,9
...

私は最小、最大、平均を計算する方法を知っていますが、最初にawkに触れ、性別や国別にデータをグループ化する方法がわかりません。

誰でも私を助けることができますか?

ベストアンサー1

これは宿題のように見えるので、完全な答えは提供せず、ヒントと部分的な例だけを提供します。

各国で、最大と最小のキーと体重、合計累積キーと体重、合計累積メダル、記録数(後で平均を計算できるように)を追跡したいと思います。

これを行うには、複数の連想配列(追跡値ごとに1つ)を使用し、$1(国)を配列キーとして使用します。

たとえば、

if ($2 == gender && $3 == sport) {
  count[$1]++;
  medals[$1] += $6 + $7;

  if ($4 > maxH[$1]) {maxH[$1] = $4};
  if ($4 < minH[$1]) {minH[$1] = $4};
  totalH[$1] += $4;

  if ($5 > maxW[$1]) {maxW[$1] = $5};
  if ($5 < minW[$1]) {minW[$1] = $5};
  totalW[$1] += $5;
}

出力ステップと平均計算はあなたに任せます。


実際、国と性別の異なる値を同時に追跡する必要がある場合は、一種の多次元配列を使用できます。

gawk配列の配列がサポートされているので、既存のawkを使用するよりも簡単です(参照多次元配列そして配列の配列)

たとえば、国($1)と性別($2)を配列次元のキーとして使用します。

if ($3 == sport) {
  count[$1][$2]++;
  medals[$1][$2] += $6 + $7;

  if ($4 > maxH[$1][$2]) {maxH[$1][$2] = $4};
  if ($4 < minH[$1][$2]) {minH[$1][$2] = $4};
  totalH[$1][$2] += $4;

  if ($5 > maxW[$1][$2]) {maxW[$1][$2] = $5};
  if ($5 < minW[$1][$2]) {minW[$1][$2] = $5};
  totalW[$1][$2] += $5;
}

最後に、スポーツ、国、性別別にグループ化する必要がある場合は、$3スポーツ()をキーとする3番目の配列次元を使用できます。

おすすめ記事