按多列分组 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(country) 作为数组键。

例如:

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) 作为键的第三个数组维度。

相关内容