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

何が間違っているのかわかりません。私はタイプミスがないか、何も捕まらなかったことを確認するためにスクリプトを読み直しました。なぜゼロに分割しようとしているのかを混乱させます。この値はゼロにしてはいけません。私は何が間違っていましたか?

ベストアンサー1

ゼロ以外の値を代入したことがない変数がありますが、除算をするとその変数が除数なので「END0で除算しようとした」という致命的なエラーが発生します。

> grep -n totalCasesMI script.awk
10:    totalCasesMI=0
37:    print "MI DD Proportion: " drunkCasesMI/totalCasesMI
38:    print "MI Dark Proportion: " darkCasesMI/totalCasesMI

10行が欠落していても同じことが起こります。awkこれは、変数が初期化されていない場合は空の文字列またはゼロと評価されるためです。

この状況の良い解決策は、最初に除数がゼロであるかどうかをテストすることです。これは、実際に変数に値を割り当てるためにコードを変更した後でも機能します。次の条件文が良いでしょう。

(totalCasesMI==0 ? "N/A" : drunkCasesMI/totalCasesMI)

おすすめ記事