여러 열로 그룹화 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(국가)를 배열 키로 사용합니다.

예를 들어:

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스포츠( )를 키로 하는 세 번째 배열 차원을 사용할 수 있습니다.

관련 정보