अंतरिक्ष द्वारा अलग किए गए स्तंभ A और B के मानों की सूची जोड़ें और योग का परिणाम दिखाएं [डुप्लिकेट]

Dec 29 2020

मेरे पास एक फाइल है 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

जवाब

5 αғsнιη Dec 29 2020 at 00:00

के साथ 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
ctac_ Dec 30 2020 at 01:56

यह डीसी के लिए एक अच्छा काम है।

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  


मांग पर अधिक डीसी का आनंद लें ।