एक grep के परिणाम से संख्याओं को जोड़ना


23

मैं निम्नलिखित कमांड चलाता हूं:

grep -o "[0-9] errors" verification_report_3.txt | awk '{print $1}'

और मुझे निम्नलिखित परिणाम मिले:

1
4
0
8

मैं प्रत्येक संख्या को रनिंग काउंट वेरिएबल में जोड़ना चाहता हूं। क्या कोई जादू एक लाइनर है जो मुझे बनाने में मदद कर सकता है?

जवाबों:


31
grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }'

यह सूची को प्रिंट नहीं करता है, लेकिन राशि को प्रिंट करता है। यदि आप सूची और राशि दोनों चाहते हैं, तो आप यह कर सकते हैं:

grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1; print $1} END { print SUM }'

शॉन - आपके उत्तर के लिए धन्यवाद। मैं वापस बॅक स्क्रिप्ट को awk से कैसे वापस कर सकता हूँ?
अमीर अफगानी

2
@ आप इस तरह से पहले का उपयोग करेंगे variable=$(grep -o "[0-9] errors" verification_report_3.txt | awk '{ SUM += $1} END { print SUM }')यह कमांड के आउटपुट को डालता है (जो कि केवल मूल्य है) चर में कहा जाता हैvariable
Shawn J. Goff

3
@Amir अफगानी इसके अलावा, आप अपने grep को बदलना चाह सकते हैं "[0-9]\+ errors"। यदि आपकी लाइन रिपोर्टिंग> 9 त्रुटियां हैं तो यह मेल खाएगा।
शॉन जे। गोफ

हाँ, वाह मुझे विश्वास नहीं हो रहा है कि मैं चूक गया। धन्यवाद।
अमीर अफगानी

शॉन, आउटपुट ऐसा लगता है जैसे यह मेरे परिणामों को जोड़ नहीं रहा है। यह इस तरह दिखता है: कुल त्रुटियां = + 259 + 7581 + 8852 + 2014 + 3189 ++ 13572 + 11438 +++ 6 + 4172 +
अमीर अफगानी


6

आप GNU प्रणाली का उपयोग करते हुए दिखाई देते हैं , इसलिए यदि पर्ल नियमित अभिव्यक्ति समर्थन उपलब्ध है, तो आप कुछ इस तरह लिख सकते हैं:

grep -Po '[0-9]+(?=\s+errors)' infile | 
  paste -sd+ | 
    bc

पीएस I ने संख्या> 9 की अनुमति देने के लिए नियमित अभिव्यक्ति (+ क्वांटिफायर जोड़ा) को संशोधित किया।

PS वैकल्पिक रूप से, पर्याप्त पर्याप्त है ( GNU awk को मानते हुए ):

awk 'END { print s }
/[0-9]+[[:space:]]+errors/ { 
  s += $1 
  }' infile

मेरे लिए पहला वाला बस प्रिंट करता है जो पहले ही पाइप में चला गया था ...
ज़ेरुस

3

अपने grep से आउटपुट को पाइप करने का प्रयास करें

awk 'BEGIN {total=0;}{total+=$1;}END {print "Total: ",total}'

2

मैं इसका उपयोग करता हूं:

$ echo $(cat file | sed 's/$/+/') 0 | bc

यह बड़ी सूचियों के लिए कुशल नहीं है, लेकिन मेरे अधिकांश उपयोग के मामलों के लिए यह ठीक है। मैं आमतौर पर प्रक्रिया को स्वचालित करने के लिए एक शेल फ़ंक्शन का उपयोग करता हूं ताकि मुझे केवल एक फ़ाइल नाम प्रदान करना पड़े:

## cheezy summation
##   call from .bashrc
##
getsum () { echo $(cat $1 | sed 's/$/+/') 0 | bc; }
gethsum () { echo $(cat $1 | sed 's/[gG]/*1000M/' | sed 's/[mM]/*1000K/' | sed 's/[kK]/*1000/' | sed 's/$/+/') 0 | bc; }
gethexsum () { echo ibase=16 $(cat $1 | sed 's/$/+/') 0 | bc; }

यदि आप अपने डेटा को किसी अन्य फ़ैशन में सीमांकित करते हैं, तो आप हमेशा एक विशिष्ट तत्व विभाजक या वर्ण वर्ग के लिए अंत-लाइन का विकल्प चुन सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.