gawk - 0으로 치명적인 나누기를 시도했습니다.

gawk - 0으로 치명적인 나누기를 시도했습니다.

그래서 아래와 같이 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)

관련 정보