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"

두 번째 열에 휴스턴과 보스턴이 포함된 항목만 고려되도록 첫 번째 열과 두 번째 열을 통해 세 번째 열의 모든 양수 값의 평균을 계산하고 싶습니다.

출력이 다음과 같기를 원합니다.

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귀하의 출력과 더 잘 일치 하도록 변경했습니다 .

또 다른 문제는 필드 2와 필드 3이 참조된다는 점인데, 이는 필드 3의 값이 0으로 처리되므로 계산에 좋지 않습니다. 빠른 수정은 모든 따옴표를 $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

"세 번째 열에 있는 모든 양수 값의 평균을 계산한다"는 것은 양수 값만 고려해야 한다는 의미라면 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

관련 정보