2012-03-07 11 views
5

द्वारा अजीब घातक विभाजन से छुटकारा पाने के लिए कैसे, जब भी मैं अजीब का उपयोग करके औसत और मानक विचलन की गणना करने की कोशिश कर रहा हूं, मुझे "awk: घातक: शून्य प्रयास द्वारा विभाजन" त्रुटि मिल रही है।शून्य त्रुटि

मेरे आदेश

awk '{s+=$3} END{print $2"\t"s/(NR)}' >> mean; 
awk '{sum+=$3;sumsq+=$3*$3} END {print $2"\t"sqrt(sumsq/NR - (sum/NR)^2)}' >>sd 

है किसी भी एक है कि यह कैसे हल करने के लिए पता है?

+0

आपकी इनपुट फ़ाइल क्या है? – kev

उत्तर

4

आपकी समस्या यह है कि ... आप शून्य से विभाजित हैं।

awk '{s+=$3} END{print $2"\t"s/(NR)}' >> mean; 
awk '{sum+=$3;sumsq+=$3*$3} END {print $2"\t"sqrt(sumsq/NR - (sum/NR)^2)}' >>sd 

पहले आदेश EOF को मानक इनपुट से पढ़ता है:

आप दो आदेशों की है। दूसरा आदेश तब चलाया जाता है, मानक इनपुट पढ़ने की कोशिश करता है, लेकिन यह पता चलता है कि यह खाली है, इसलिए इसमें शून्य रिकॉर्ड पढ़े गए हैं, इसलिए NR शून्य है, और आप 0 से विभाजित हो रहे हैं, और क्रैश हो रहे हैं।

आपको एक ही कमांड में औसत और मानक विचलन दोनों से निपटने की आवश्यकता होगी।

awk '{s1 += $3; s2 += $3*$3} 
    END { if (NR > 0){ 
       print $2 "\t" s1/NR; 
       print $2 "\t" sqrt(s2/NR - (s1/NR)^2); 
      } 
     }' 

यह विभाजित-शून्य-शून्य त्रुटियों से बचाता है।

+0

क्या इसके लिए कोई फिक्स है? –

+0

क्या मैं कुछ चीज कर सकता हूं? अजीब 'अगर (एनआर> 0) {एस + = $ 3} अंत {प्रिंट $ 2 "\ t" एस/(एनआर)}' >> मतलब; –

+0

'END' ब्लॉक है जहां समस्या होती है। आपका प्रस्ताव वास्तव में विकृत रूप से विकृत है, वास्तव में; यदि आपने 'if' छोड़ा है, तो यह' काम करेगा ', लेकिन फिर भी खाली इनपुट के साथ शून्य से विभाजित होगा। –