मैं दो कॉलम से मूल्यों को कैसे जोड़ सकता हूं?


11

मेरे पास निम्नलिखित प्रारूप में एक फाइल है:

$ cat /tmp/raw
2015-01   5000   1000
2015-02   6000   2000
2015-03   7000   3000

अब, मैं चाहता हूं कि प्रत्येक पंक्ति में कॉलम 2 और 3 से संयुक्त मूल्य प्राप्त किया जाए ताकि परिणाम निम्नानुसार हों:

2015-01   6000
2015-02   8000
2015-03   9000

मैंने यह कोशिश की लेकिन यह केवल 2015-03 के मूल्य की तरह फ़ाइल में अंतिम मूल्य दिखाता है।

जवाबों:


11

आप प्रयोग करके देख सकते हैं awk:

awk '{ print $1, $2 + $3; }' /tmp/raw

परिणाम होगा (मुझे लगता है कि 2015-03 का मान 10000 होना चाहिए):

2015-01 6000
2015-02 8000
2015-03 10000

1
मुझे विश्वास नहीं हो रहा है कि मुझे इसका उत्तर जल्दी मिल गया: ओ, मुझे कभी भी किसी अन्य मंच पर ऐसा त्वरित उत्तर नहीं मिला :) धन्यवाद, कमांड ने पूरी तरह से काम किया :)
सैयद जहाँज़ीब

@SyedJahanzaib, यदि इस उत्तर ने आपकी समस्या हल कर दी है, तो कृपया एक क्षण लें और बाईं ओर चेक मार्क पर क्लिक करके इसे स्वीकार करें। यह प्रश्न के उत्तर के रूप में चिह्नित करेगा और स्टैक एक्सचेंज साइटों पर धन्यवाद व्यक्त करने का तरीका है।
terdon

क्षमा करें, मैं उत्तर को चिह्नित करना भूल गया। और वहाँ के बहुमूल्य समय और उत्तरों के लिए भी आप सभी का धन्यवाद करते हैं, उन्होंने मुझे अलग-अलग तरीकों से लक्ष्य हासिल करने में भी मदद की :) :)
सैयद जहाँज़ाईब

@SyedJahanzaib, हालांकि मैंने इस उत्तर के लिए अच्छा बैज अर्जित किया है, मुझे लगता है कि यह अधिक सटीक और व्यापक है टेर्डन का जवाब।
तालीज़िन

16

यहाँ कुछ तरीके हैं:

  1. एक और जाग दृष्टिकोण

    awk '{$2+=$3;}NF--' file
    
  2. पर्ल

    perl -lane 'print "$F[0] ",$F[1]+$F[2]' file
    

    या

    perl -ape 's/$F[1].*/$F[1]+$F[2]/e' file
    
  3. शेल (ऊपर से बहुत धीमा / कम कुशल)

    while read a b c; do echo "$a $((b + c))"; done < file
    

2
$2+=$3अधिक भयानक हो सकता है।
123

@ User112638726 वास्तव में यह है। धन्यवाद।
terdon

3
तुम भी इस्तेमाल कर सकते हैं awk '{$2+=$3}NF--'तो वहाँ अभी भी एक खाली क्षेत्र 3 के बारे में फांसी नहीं है। हालाँकि यह सिर्फ मेरी पसंद है, और इसके अपने उत्तर पर भी समान है :)
123

1
@ उपयोगकर्ता 112638726 अब मेरे पास भी नहीं था। बहुत अच्छा, धन्यवाद!
terdon

मैंने लिखा यह आप के लिए। ध्यान दें कि कैसे न केवल sedकिसी तरह से खेतों को समझने का प्रबंधन करता है - यहां तक कि मक्खी पर खेतों को परिभाषित करने के लिए, और खेतों में डब्ल्यू / खेतों में - लेकिन, जैसा कि स्पष्ट रूप से मामला है, यूनिक्स रेगेक्सप मिलान की पूरी अवधारणा वास्तव में खेतों में एक स्ट्रिंग को विभाजित करने पर आधारित है। एक पैटर्न के अनुसार ! किसे पता था?
मिकसेर्व

5
sed 's/[^ ]* */[&]P/;s//&+pc/3'|dc

... प्रिंट ...

2015-01   6000
2015-02   8000
2015-03   10000

तो ऊपर मैं एक घोषित नियमित अभिव्यक्ति जो एक को परिभाषित करता है क्षेत्र के हद तक है कि एक के होते हैं *चर लंबाई वर्ण जो कर रहे हैं की एक अनुक्रम ^नहीं <अंतरिक्ष> तुरंत एक के बाद *चर लंबाई वर्ण जो कर रहे हैं की एक अनुक्रम <अंतरिक्ष> । यह घोषणा sed's पैटर्न स्पेस के खिलाफ लागू होती है, जो कि प्रत्येक ईलाइन वर्ण द्वारा एक स्ट्रिंग सीमांकित (डिफ़ॉल्ट रूप से) है \nजो इनपुट में होता है, और जिसे पुनरावृत्ति (डिफ़ॉल्ट रूप से) उसी की प्रत्येक घटना के लिए बदल दिया जाता है

इस घोषणा के लिए इंटरफ़ेस दो-गुना है, और प्रत्येक स्तर पर कम से कम एक अंतरराष्ट्रीय IEEE आधिकारिक मानक समिति द्वारा पूरी तरह से विनियमित और निर्दिष्ट किया गया है ताकि sedकमांड सिंटैक्स के पूर्वानुमान योग्य अनुप्रयोग को सुनिश्चित किया जा सके । उदाहरण के लिए, sedएपीआई सिंटैक्स को इस मामले में /पता /कमांड के साथ लागू किया जाता है (जो हमेशा किसी भी , sed s///हस्तांतरण कमांड का पहला घटक होता है ) , लेकिन उसी की सामग्री को एक अधिक बुनियादी एपीआई द्वारा व्याख्या की जाती है, जो इसके लिए निर्दिष्ट है। मानक सी लाइब्रेरीregcomp() में कार्य करता है ।

मैं इन बयानों आत्मविश्वास से कर सकते हैं, क्योंकि sedहै नहीं महज एक कार्यक्रम है, बल्कि निष्पादन नामित संकलित sedपर अपने यूनिक्स की तरह मशीन एक है कार्यान्वयन अच्छी तरह से परिभाषित, ऐतिहासिक स्थापित की है, और मानकों नियंत्रित sed आवेदन अपने सिस्टम के regular- की पुस्तकालयों से मेल खाते अभिव्यक्ति।


से sedकल्पना:

sedउपयोगिता Brès में वर्णित का समर्थन करेगा XBD बेसिक रेगुलर एक्सप्रेशन ...

... जहाँ हम पाते हैं ...

दोनों बीआरईएस और eres तहत POSIX.1-2008 की प्रणाली इंटरफेस मात्रा में नियमित अभिव्यक्ति मिलान इंटरफ़ेस द्वारा समर्थित हैं regcomp(), regexec()और संबंधित कार्यों।

एक एप्लिकेशन जो कॉल करता है regcomp()वह इसे एक पैटर्न स्ट्रिंग और पेश करेगा ...

... [t] वह regcomp()कार्य करता है जो नियमित रूप से स्ट्रींग में निहित अभिव्यक्ति को पैटर्न तर्क द्वारा इंगित करेगा और परिणाम को संरचना में पूर्व निर्धारित करेगा ...

उस पर कार्रवाई करने के लिए, कहा गया कि आवेदन तब regcomp()साथी समारोह का उल्लेख करेगा ...

... [टी] वह regexec()ढंग से काम अशक्त-समाप्त स्ट्रिंग द्वारा निर्दिष्ट तुलना स्ट्रिंग संकलित नियमित अभिव्यक्ति के साथ preg करने के लिए एक पिछले कॉल से प्रारंभ regcomp()...

... स्ट्रिंगregexec() के सबस्ट्रिंग के ऑफसेट के साथ [a] एरे के तत्वों को भरना होगा जो पैटर्न के कोष्ठक उप-अक्षरों से मेल खाते हैं ... पैटर्न ही सब-डेप्रेशन के रूप में गिना जाता है ...\(\)

... [टी] वह regexec()ढंग से काम सब लिखना चाहिए Nmatch के तत्वों pmatch , जहां Nmatch और pmatch आवेदन के द्वारा आपूर्ति की जाती है, भले ही के कुछ तत्वों pmatch में subexpressions के साथ संगत नहीं पैटर्न


और इसलिए जब मैं करता हूं ...

/[^ ]* */

... sedपहले नियमित अभिव्यक्ति संकलित करता है और परिणामों को मेमोरी में संग्रहीत करता है, फिर बाद में मेरे पैटर्न-स्पेस की सामग्री पर संकलित-ऑटोमेटन लागू करता है जितनी बार मेरी कमांड को पूरा करने के लिए आवश्यक है। हर बार जब यह परिणाम होता है, तो एक-या अधिक अशक्त-सीमांकित फ़ील्ड की एक सरणी होती है, जिसके द्वारा वापस किए गए ऑफ़सेट पर सीमांकित किया जाता है regexec()

और जब मैं करता हूँ ...

//

... यह इंगित करने के लिए कि सबसे हाल ही में परिभाषित नियमित अभिव्यक्ति का उपयोग किया जाना चाहिए, sedबस regexec()फिर से पूर्वनिर्धारित नियमित अभिव्यक्ति का पुन: उपयोग कर कॉल कर सकते हैं , लेकिन संभवतः इसे इस बार एक बदले हुए स्ट्रिंग तर्क पर लागू कर सकते हैं या नए nmatch मापदंडों को लागू कर सकते हैं जैसा कि मैं आदेश देता हूं।

अधिक विशेष रूप से अभी भी ...

  • s/[^ ]* */[&]P/
    • की पहली आवृत्ति को बदलने के पैटर्न एक साथ पैटर्न अंतरिक्ष में [छोड़ दिया वर्ग कोष्ठक, तो &ही है, तो एक ]सही वर्ग ब्रैकेट एक के बाद Pचरित्र।
  • s//&+pc/3
    • वर्तमान पैटर्न अंतरिक्ष के लिए फिर से पिछली बार उपयोग नियमित अभिव्यक्ति लागू होते हैं, और की जगह 3की तीसरी घटना पैटर्न के साथ पैटर्न अंतरिक्ष में &ही संलग्न स्ट्रिंग हो +pc

और इसलिए sedइनपुट के प्रत्येक लाइन के लिए यह अपने stdout को लिखता है, आपका उदाहरण डेटा दिया गया है:

[2015-01   ]P5000   1000+pc
[2015-02   ]P6000   2000+pc
[2015-03   ]P7000   3000+pc

यह अजीब लग सकता है, लेकिन dcकैलकुलेटर वर्ग कोष्ठक के बीच इसके इनपुट में स्ट्रिंग को उद्धृत करता है , और Pकमांड दोनों इनपुट के ढेर के बिना एक \nइवलाइन और बाद में पॉप अप करने के बिना स्टैक के शीर्ष को प्रिंट करेगा ।

और इसलिए, उदाहरण के रूप में पहली पंक्ति का उपयोग करते हुए, dcकरेंगे:

  • [2015-01 ]P
    • Pरिंट और स्टैक के शीर्ष पर पॉप करें
  • 5000
    • 5000स्टैक के शीर्ष पर संख्या को पुश करें और स्टैक पर वर्तमान में सभी तत्वों को धक्का दें (अब कोई नहीं) एक के बाद एक।
  • 1000
    • डिट्टो, लेकिन इस बार मुख्य स्टैक के शीर्ष पर 5000 की संख्या एक नीचे धकेल दी जाती है, और स्टैक पर दूसरा तत्व बन जाता है।
  • +
    • स्टैक पर शीर्ष दो संख्याओं को एक साथ जोड़ें, स्टैक के उन दोनों को पॉप करें और स्टैक के शीर्ष पर योग को पुश करें।
    • यह संख्या के केवल एक ढेर में परिणाम है 6000
    • यह एक सिंटैक्स त्रुटि है यदि स्टैक पर शीर्ष दो तत्वों में से एक [स्ट्रिंग है ]
  • p
    • pस्टैक के ऊपर से \nपॉपिंग के बिना एक संलग्न ईलाइन द्वारा पीछा किए गए स्टैक के शीर्ष को रिंट करें।
  • c
    • cढेर लगाओ

मेरा मानना ​​है कि यह काम करता है, लेकिन मैं इसे पार्स नहीं कर सकता। कुल मिलाकर, आप dc के लिए एक अतिरिक्त सेट कर रहे हैं। पहला पैटर्न समझ में आता है। मुझे लगता है कि यह तिथि और अनुगामी रिक्त स्थान से मेल खाता है, लेकिन मुझे वह नहीं मिलता है जो चरित्र वर्ग कोष्ठक ([&]) के अंदर रखता है। यह बहुत अच्छा होगा यदि आप इसे एक जादू करेंगे।
जो

1
@ जो - कोई बेहतर?
मिकसेर

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

@ जो - ठीक है ... शायद मैं एक छोटे से ओवरबोर्ड चला गया ...
चाटुकार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.