अंतरिक्ष द्वारा अलग किए गए स्तंभ A और B के मानों की सूची जोड़ें और योग का परिणाम दिखाएं [डुप्लिकेट]
मेरे पास एक फाइल है fold.txt
। एक स्थान से अलग होने वाली प्रत्येक लाइनों में इसके दो मूल्य होते हैं। यदि मैं कहता हूं कि पहला मान कॉलम A का प्रतिनिधित्व करता है और दूसरा स्थान कॉलम B के बाद का है तो मैं कॉलम A के सभी मूल्यों और कॉलम B के सभी मूल्यों को कैसे जोड़ सकता हूं और प्रत्येक कॉलम के जोड़ को व्यक्तिगत रूप से दिखाऊंगा?
मैं कुछ इस तरह की उम्मीद कर रहा हूँ:
$ cat fold.txt
100 500
200 300
700 100
आउटपुट:
Total count Column A = 1000
Total count column B = 900
जवाब
के साथ awk
:
awk '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
में awk भाषा है जो पाठ प्रसंस्करण प्रयोजनों के लिए एक उपकरण है, $1
पहले कॉलम के मूल्य का प्रतिनिधित्व, $2
दूसरे स्तंभ के मूल्य का प्रतिनिधित्व, $3
तीसरे के लिए और इतने पर और एक विशेष एक NF
अंतिम स्तंभ ईद का प्रतिनिधित्व करते है और उसके अनुसार $NF
अंतिम स्तंभ के मूल्य (है तो आप की जगह ले सकता $2
ऊपर के साथ $NF
भी, और हाँ जब आप इसे NF
अंतिम कॉलम आईडी के रूप में पकड़ते हैं , तो चर का मूल्य आपको बताता है कि आपके पास कितने कॉलम हैं (प्रत्येक पंक्ति के लिए इसका मूल्य अद्यतन इनपुट पढ़ा जाता है)।
किनारे के मामले को संभालने के लिए जहां इनपुट फ़ाइल खाली है और फिर भी संख्यात्मक आउटपुट प्राप्त करते हैं, हम awk
आउटपुट संख्यात्मक परिणाम के लिए मजबूर करने के लिए 0 जोड़ते हैं ।
कॉलम (या फ़ील्ड) awk
को FS
वैरिएबल ( F eild S eparator) द्वारा प्रतिष्ठित किया जाता है, जो डिफ़ॉल्ट रूप से स्पेस / टैब का उपयोग करता है। यदि आप कॉलम को अलग-अलग वर्णों पर विभाजित करना चाहते हैं, तो आप इसे इस प्रकार -F
विकल्प के साथ पुनर्परिभाषित कर सकते हैं awk
:
awk -F'<character-here>' '...' infile
या इसके BEGIN{...}
साथ ब्लॉक के भीतर FS
:
awk 'BEGIN{ FS="<character-here>"; }; { ... }' infile
उदाहरण के लिए नीचे की तरह इनपुट फ़ाइल के लिए (अब यह अंतरिक्ष के बजाय अल्पविराम है):
100,500
200,300
700,100
आप अपना awk
कोड निम्नानुसार लिख सकते हैं :
awk -F',' '{ sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
या BEGIN
ब्लॉक के भीतर :
awk 'BEGIN{ FS=","; }; { sum_A +=$1; sum_B+=$2; };
END{ print "Total count Column A = " sum_A +0;
print "Total count column B = " sum_B +0;
}' infile
निम्न नमूने पर अपनी इनपुट फ़ाइल के सभी N कॉलमों को थोड़ा जटिल करने के लिए जा रहे हैं :
100,500,140,400
200,300,640,200
700,100,400,130
इसलिए हमने NF
पहले पैराग्राफ में बात की (NF value आपको बता रही है कि आपके पास कितने कॉलम हैं (प्रत्येक पंक्ति के अनुसार अपडेट)):
awk -F',' '{ for (i=1; i<=NF; i++) sum[i]+=$i; };
END{ for (colId in sum) {
printf ("Total count Column: %d= %d\n", colId, sum[colId] );
};
}' infile
यहाँ केवल नई चीज़ों का उपयोग किया जाता है, हम awk
एक ही कॉलम Id को मान से लेते हैं i
और उनके मानों $i
को उस सरणी में जोड़ते हैं (इस सरणी का इंडेक्स / कीज़ कॉलम Ids है); तब END{...}
ब्लॉक में हम अपने सरणी पर लूप को देखते हैं, उसके बाद कॉलम आईडी को प्रिंट करते हैं, उसके बाद सबसे पहले इसके बगल में योग करें। आपको नीचे जैसा आउटपुट दिखाई देगा:
Total count Column: 1= 1000
Total count Column: 2= 900
Total count Column: 3= 1180
Total count Column: 4= 730
यह डीसी के लिए एक अच्छा काम है।
dc ने पहले डेटा को fold.txt से और उसके बाद sum_col_dc के कोड से पढ़ा।
इसका उपयोग इस तरह करें: dc fold.txt sum_col_dc
cat sum_col_dc
[lB+sBlA+sAz0<C]sC[lGLElDnnnp]sH[Total count Column ]sD[B]sE[A]SE[ = ]sGlCxlAlHxlBlHx
थोड़ा और विवरण के साथ:
[lB+sBlA+sAz0<C]sC
[lGLElDnnnp]sH
[Total count Column ]sD
[B]sE
[A]SE
[ = ]sG
lCx
lA
lHx
lB
lHx
मांग पर अधिक डीसी का आनंद लें ।