Awk, sed का उपयोग करके विशिष्ट पैटर्न के साथ लाइनों का हिस्सा निकालना


18

मेरे पास awk / sed ऑपरेटरों के बारे में एक प्रश्न है। मेरे पास एक बड़ी फाइल है जिसमें बार-बार लाइनों का सेट है

Expression loweWallrhoPhi :  sum=-6.97168e-09
Expression leftWallrhoPhi :  sum=6.97168e-09
Expression lowerWallPhi :  sum=-5.12623e-12
Expression leftWallPhi :  sum=5.12623e-12
Expression loweWallrhoUSf :  sum=-6.936e-09
Expression leftWallrhoUSf :  sum=6.97169e-09
Expression lowerWallUSf :  sum=-5.1e-12
Expression leftWallUSf :  sum=5.12624e-12

मैं अलग-अलग फ़ाइल में प्रत्येक मामले में योग के बाद मूल्य निकालना चाहता हूं। क्या एक बार में ऐसा करना संभव है?

जवाबों:


26

Grep कमांड के साथ:

grep -oP 'sum=\K.*' inpufile > outputfile

grep -P(perl-regexp) पैरामीटर का समर्थन करता है \K, जो पहले से मिलान किए गए वर्णों को अनदेखा करने के लिए उपयोग करता है ।

Awk कमांड के साथ:

awk -F"=" '{print $NF}' inputfile > outputfile

Awk NFआपको एक रिकॉर्ड / लाइन में कुल फ़ील्ड देता है। तो उस का अंतिम मान एक रिकॉर्ड / लाइन में अंतिम क्षेत्र संख्या है।

Sed कमांड के साथ:

sed 's/^.*sum=//' inpufile > outputfile

^.*=sum.*लाइन की शुरुआत ( ^) और अंतिम अक्षर ( sum=) के बीच सभी वर्णों को बदलें ।

परिणाम:

-6.97168e-09
6.97168e-09
-5.12623e-12
5.12623e-12
-6.936e-09
6.97169e-09
-5.1e-12
5.12624e-12

यदि आप प्रत्येक मान को एक अलग फ़ाइल में सहेजना चाहते हैं, तो ऊपर दिए गए आदेशों को थोड़ी देर के लूप में उपयोग करें:

while read line; do
    echo "$line" | grep -oP 'sum=\K.*'     > $(echo "$line" |awk '{print $2}');
   #echo "$line" | awk -F"=" '{print $NF}' > $(echo "$line" |awk '{print $2}');
   #echo "#line" | sed 's/^.*sum=//'       > $(echo "$line" |awk '{print $2}');
done < file

इसमें वह भी शामिल है sum=और उसके बाद के मूल्य के समान नहीं हैsum=
एंथन

ओपी योग के बाद मूल्य चाहता है, यह भी कि एनएफ का अजीब विवरण भयानक है।

1
यह बहुत अच्छा जवाब पूरा करने के लिए, आप भी उपयोग कर सकते हैं cut: cut -d'=' -f2 file
फेडोरक्वि

यह बहुत अच्छा जवाब है। मुझे अच्छा लगा। धन्यवाद।
जाफर विल्सन

6

यदि मैं उस प्रश्न को सही ढंग से समझता हूं जिसे आप केवल मान प्राप्त करना चाहते हैं =, और इन मानों को अलग-अलग फ़ाइलों में संग्रहीत करें, तो दूसरे क्षेत्र () पर आधारित है। अगर मैं सही हूँ तो कुछ इस तरह की कोशिश करो:

$ awk -F'[ =]' '{print $6>"file_"$2".txt"}' file

परिणाम:

$ ls -1
  file_leftWallPhi.txt
  file_leftWallUSf.txt
  file_leftWallrhoPhi.txt
  file_leftWallrhoUSf.txt
  file_loweWallrhoPhi.txt
  file_loweWallrhoUSf.txt
  file_lowerWallPhi.txt
  file_lowerWallUSf.txt

$ cat  file_leftWallPhi.txt
  5.12623e-12

@ कासिया मैं GNU awk 4.0.2 के साथ आपकी समस्या को पुन: पेश नहीं कर सकता। मेरे उत्तर से कमांड भी -cविकल्प के साथ काम करता है (पारंपरिक यूनिक्स के साथ संगतता मोड awkजहां GNU एक्सटेंशन अक्षम हैं)। कृपया सुनिश्चित करें कि आपने इनपुट फ़ाइल अपडेट कर दी है क्योंकि मूल प्रश्न संपादित किया गया था और खाली लाइनें हटा दी गई थीं।
जिम्मीज

1

आप इसे करके देख सकते हैं sed

sed -E 's/^.* (\S+)\s*:.*=(\S+)/echo "\2" > "\1".txt/' file | bash

स्क्रिप्ट लाइन में दो टुकड़ों का पता लगाती है:

  1. रिक्त स्थान के बीच में और :कुछ (अधिक 0 तब) गैर-स्थान चिह्न होना चाहिए;
  2. कुछ (अधिक तब 0) गैर-अंतरिक्ष प्रतीकों के बाद =;

और निष्पादन कमांड में इसका प्रारूप जिसे पाइप के माध्यम से स्थानांतरित किया गया है bash


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