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番目の配列次元を使用できます。