현재 다음과 같은 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