そこで、以下のように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
ゼロ以外の値を代入したことがない変数がありますが、除算をするとその変数が除数なので「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
これは、変数が初期化されていない場合は空の文字列またはゼロと評価されるためです。
この状況の良い解決策は、最初に除数がゼロであるかどうかをテストすることです。これは、実際に変数に値を割り当てるためにコードを変更した後でも機能します。次の条件文が良いでしょう。
(totalCasesMI==0 ? "N/A" : drunkCasesMI/totalCasesMI)