2009-09-16 19 views
8

के माध्यम से किसी भी क्षेत्र पर औसत की गणना करने के लिए जेनेरिक अजीब स्क्रिप्ट मैं एक जेनेरिक अजीब स्क्रिप्ट लिखना चाहता हूं जो फ़ाइल और फ़ील्ड नंबर (उस फ़ाइल में) इनपुट के रूप में ले सकती है और मुझे उस क्षेत्र का औसत मूल्य दे सकती है वह फाइल मैं यह कुछ इस तरह का प्रयोग करेंगे:कमांड लाइन तर्क

bash$ avg.awk 3 input.file 
22 
bash$ avg.awk 4 input.file 
2001 

बेशक, मैं स्क्रिप्ट अगर मैं जानता हूँ कि जो क्षेत्र (जैसे, $ 3) मैं पहले से औसत करने के लिए जा रहा हूँ लिख सकते हैं। यह कुछ ऐसा होगा:

//{tot+=$3; count++} 
END{ 
    print tot/count; 
} 

लेकिन मैं उस क्षेत्र को बदलने में सक्षम होना चाहता हूं जिसे मैं कमांड लाइन विकल्प के माध्यम से औसत करना चाहता हूं। क्या यह संभव है? धन्यवाद!

उत्तर

11

यह एक तुम क्या चाहते हो जाएगा:

$ cat avg.awk 
#!/usr/bin/env awk -f 
# Calculate average, syntax: avg.awk field-number file 
BEGIN { field = ARGV[1]; ARGV[1] = "" } 
{ sum += $field } 
END { print sum/NR } 

$ cat data 
1 5 7 
3 6 5 
8 4 6 

$ avg.awk 1 data 
4 

$ avg.awk 2 data 
5 

$ avg.awk 3 data 
6 
+1

मैं आपके द्वारा वर्णित तरीके से env का उपयोग नहीं कर सका। अभी के लिए, मैंने अभी तक असली रास्ता डाला है। हालांकि यह काम करता है। धन्यवाद! – Ritesh

+0

/usr/bin/env का उपयोग इस तथ्य से निपटने का मेरा तरीका है कि अलग-अलग सिस्टम अलग-अलग स्थानों में अजीब स्थापित करते हैं। आप कमांड प्रॉम्प्ट से 'en env' जारी करना चाहते हैं ताकि यह पता चल सके कि आपके सिस्टम में env कहां है। –

+0

/usr/bin/env: awk -f: ऐसी कोई फ़ाइल या निर्देशिका यह वह संदेश है जो मुझे मिल रहा है। env/usr/bin/env में है। यद्यपि आपने मेरी प्रारंभिक समस्या हल की है, लेकिन यह जानना अच्छा लगेगा कि कैसे env का उपयोग किया जा सकता है। – Ritesh

5
{ tot += $field; count++ } 
END { print tot/count } 

कॉल तरह awk -v field=3 -f avg.awk input.file

+2

आप एनआर का उपयोग गिनती चर होने से बचाने के कर सकते हैं: {मुन्ना + = $ च} अंतिम {प्रिंट मुन्ना/एनआर} –

+1

... मानते हुए कि ओपी वास्तव में हेडर को फ़िल्टर करना या रिकॉर्ड छोड़ना नहीं चाहता है। :) –

+0

धन्यवाद, यह निश्चित रूप से काम करता है! दूसरा जवाब कमांड लाइन को उपयोग करने में आसान बनाता है :) – Ritesh

संबंधित मुद्दे