그래서 아래와 같이 script.awk라는 간단한 gawk 스크립트를 작성했습니다.
#! /usr/bin/gawk -f
# Sorts by ascending order
# ROCINFO["sorted_in"] = "@ind_num_asc"
BEGIN{
FS=","
drunkCases=0
totalCases=0
friSatAccident=0
totalCasesMI=0
drunkCasesMI=0
darkCasesMI=0
}
#Count total cases so we can calculate proportions
NR>1{totalCases+=1}
#Count drunk driving cases
NR>1 && $52>=1{drunkCases+=1}
#Count accidents on Friday or Saturday
NR>1 && ($15 == 6 || $15 == 7) {friSatAccident+=1}
#Count total Accident cases in michigan
NR>1 && $1 == 26 {totalMI+=1}
#Count total Drunk drivers in michigan accidents
NR>1 && $1 == 26 && $52 >= 1 {drunkCasesMI+=1}
# Counts accidents in michigan that occured in the dark
NR>1 && $1 == 26 && ($36 == 2 || $36 == 3 || $36 == 6) {darkCasesMI+=1}
#array that holds number of people for each state code in a key where the key is the state code.
NR>1{stateAccCount[$1]+=$9}
END{
print "DD Proportion: " drunkCases/totalCases
print "Friday/Saturday Proportion: " friSatAccident/totalCases
print "MI DD Proportion: " drunkCasesMI/totalCasesMI
print "MI Dark Proportion: " darkCasesMI/totalCasesMI
print "State Code,# People"
for (key in stateAccCount){
print key","stateAccCount[key]
}
}
그런데 실행하려고 하면 다음과 같은 오류가 발생합니다.
Your code produced an error when running
gawk: script_cnv.awk:37: (FILENAME=- FNR=10) fatal: division by zero attempted
Stdout is
DD Proportion: 0.666667
Friday/Saturday Proportion: 0.444444
내가 뭘 잘못하고 있는지 이해가 안 돼요. 나는 오타가 없는지, 아무것도 잡지 못했는지 확인하기 위해 스크립트를 다시 읽어 보았습니다. 왜 0으로 나누려고 하는지 헷갈립니다. 이 값은 0이 되어서는 안 됩니다. 내가 뭘 잘못했나요?
답변1
0이 아닌 값을 대입한 적이 없는 변수가 있는데, END
나눗셈을 하면 그 변수가 제수이므로 '0으로 나누려고 시도했다'는 치명적인 오류가 발생합니다.
> grep -n totalCasesMI script.awk
10: totalCasesMI=0
37: print "MI DD Proportion: " drunkCasesMI/totalCasesMI
38: print "MI Dark Proportion: " darkCasesMI/totalCasesMI
10행이 누락된 경우에도 동일한 일이 발생합니다. awk
변수가 초기화되지 않은 경우 빈 문자열 또는 0으로 평가되기 때문입니다.
이 상황에 대한 좋은 해결 방법은 먼저 제수가 0인지 테스트하는 것입니다. 이는 실제로 변수에 값을 할당하기 위해 코드를 수정한 후에도 작동합니다. 다음과 같은 조건문이 좋을 것입니다.
(totalCasesMI==0 ? "N/A" : drunkCasesMI/totalCasesMI)