फ़ील्ड और रिकॉर्ड विभाजकों को संशोधित करके awk के साथ पार्स करना


1

मेरे पास एक फाइल है जो इस प्रकार है:

------------------------------------------------------------------------------------------------------------------------------------------------------------------
49515 23/6/2014 SL B                                              .OO                                  2500.00
          R ROY                             4561235
BEING THE T.E PAID
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
23495 26/7/2014  CL A                                     2300.00                                         .00
          S DAS                             2334167
BEING THE MONEY RECOVERED 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------

मेरा वांछित आउटपुट निम्नानुसार है:

49515 23/6/2014  SL B                      .00                2500.00       R ROY          4561235        BEING THE T.E PAID
23495  26/7/2014  CL A             2300.00                        .00       S DAS          2334167       BEING THE MONEY RECOVERED

मैं बहुत सफलता के बिना awk में निम्नलिखित कोड की कोशिश की, क्षेत्र विभाजक के रूप में newline सेट करने के लिए किया जा रहा विचार और रिकॉर्ड विभाजक के रूप में हाइफ़न (--------) की लाइन:

BEGIN {
   FS="/n"
   RS="^-+$"}
{ print $1,$2,$3}

FS=/n"सिर्फ गलत वर्तनी, सही है? आप उपयोग कर रहे थे FS="\n"?
terdon

क्या जवाब से आपकी समस्या हल हो गई? हम निश्चित रूप से तब तक नहीं जान सकते जब तक कि एक उत्तर स्वीकार नहीं हो जाता।
किरा

जवाबों:


3

यह आपकी आवश्यकताओं के लिए काम करना चाहिए:

awk '/---/ {print buff; buff="";} /[^-]/{buff=buff" "$0}'  filename

आप उपयोग कर सकते हैं अगर-और भी ब्लॉक:

awk '{if($0 ~ /---/){print buff; buff=""} else {buff=buff" "$0}}' filename

एक बफर का उपयोग किए बिना भी:

awk '{if($0 !~ /---/){printf "%s ", $0} else print ""}' filename

अच्छा लगा। आप केवल तब तक प्रिंट करना चाहते हैं जब तक NR==1कि शुरुआत में एक खाली लाइन को प्रिंट करने से बचें।
terdon

यह सच है, लेकिन मुझे लगा कि एक अतिरिक्त कोड की वजह से इस अतिरिक्त जाँच को जोड़ने की तुलना में एक छोटा कोड बेहतर (और समझने में आसान) होगा। हालांकि टिप्पणी के लिए धन्यवाद।
कीरा

1

आप लगभग वहाँ थे:

$ awk -F'\n' -vRS="-+\n" '($1){print $1,$2,$3; }' file
49515 23/6/2014 SL B                                              .OO                                  2500.00           R ROY                             4561235 BEING THE T.E PAID
23495 26/7/2014  CL A                                     2300.00                                         .00           S DAS                             2334167 BEING THE MONEY RECOVERED 

या, यदि आप BEGIN ब्लॉक पसंद करते हैं:

awk 'BEGIN{FS="\n"; RS="-+\n"}($1){print $1,$2,$3; }' file

समस्या (यह मानकर /nएक टाइपो थी) कि आप उपयोग कर रहे थे ^और $परिभाषा में RS। मुझे यकीन नहीं है कि RSरेगेक्स को कैसे लागू किया जाता है, लेकिन मैं वास्तव में फ़ाइल के आरंभ और अंत का उल्लेख करता हूं, रेखा का नहीं। वर्कअराउंड के रूप में, मैं एक नई पंक्ति में समाप्त होने के RSखिंचाव के लिए तैयार हूं -। हालांकि, इसका मतलब है कि यह टूट जाएगा यदि आप -एक पंक्ति के अंत में एक या अधिक हो सकते हैं । मुझे नहीं पता कि \n-+\nपहली पंक्ति के लिए असफल होने के बाद से शुरुआत से कैसे मेल खाना है ।

एक समान दृष्टिकोण ^-+$एक रिक्त रेखा के साथ बदलने और पर्ल के पैराग्राफ मोड का उपयोग करने के लिए होगा :

$ sed 's/--*/\n/' file | perl -F'\n' -00ane 'print "@F\n";' 
49515 23/6/2014 SL B                                              .OO                                  2500.00           R ROY                             4561235 BEING THE T.E PAID
23495 26/7/2014  CL A                                     2300.00                                         .00           S DAS                             2334167 BEING THE MONEY RECOVERED 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.