2012-06-25 16 views
5

में मर्ज करें मेरे पास एक टेक्स्ट फ़ाइल 9 अंकों के कॉलेज कोड से शुरू होती है और 5 अंकों के पाठ्यक्रम कोड के साथ समाप्त होती है।2 लाइनों को एक

512161000 EN5121 K. K. Jorge Institute of Engineering Education and Research, Nashik 61220 Mechanical Engineering [Second Shift] XOPENH 1 116 16978 
517261123 EN5172 R. C. Rustom Institute of Technology, Shirpur 61220 Mechanical Engineering [Second Shift] YOPENH 1 100 29555 
617561234 EN6175 abc xyz Education Trust, abc xyz College of Engineering, 
Pune 61220 Mechanical Engineering [Second Shift] ZOPENH 2 105 25017 

कुछ प्रविष्टियां हैं जहां ऊपर दिए गए 3 उदाहरण में दिखाए गए लाइन ब्रेक हैं। मैं इतना है कि मैं आसानी से ग्रेप की तरह आदेश का उपयोग कर सकते हैं, बस 1 और 2 लाइन की तरह एक में 3 और 4 लाइन मर्ज करने के लिए की जरूरत है, awk आदि

अद्यतन:

केविन के जवाब काम करने के लिए प्रतीत नहीं होता।

cat todel.txt 
112724510 EN1127 Jagadambha Bahuuddeshiya Gramin Vikas Sanstha's Jagdambha College of, 
Engineering and Technology, Yavatmal 24510 Computer Engineering LSCO 1 55 93531 

cat todel.txt | perl -ne 'chomp; if (/^\d{9}/) { print "\n$_" } else { print "$_\n" }' 
Engineering and Technology, Yavatmal 24510 Computer Engineering LSCO 1 55 93531ege of, 
+0

awk '/^[0-9] /,/[0-9] $ /' # – shantanuo

उत्तर

1

विभाजन लाइनों के संबंध में: यह sed स्क्रिप्ट मानती है कि आपके पास अग्रणी संख्या (विभाजन की पहली पंक्ति पर) के बाद कम से कम एक स्थान है, और पिछली संख्या (विभाजन की अंतिम पंक्ति पर) से पहले एक स्थान है, और यह कि प्रति विभाजन लाइन में केवल एक विभाजन है।

विंडोज सीआरएलएफ न्यूलाइन के साथ इनपुट स्वीकार करने के लिए संशोधित या * निक्स एलएफ। लेकिन ध्यान दें कि उत्पादन एक * nix \n

sed -nr 's/\r?$// # allow for '\r\n' newlines 
     /^([0-9]{9}) .* ([0-9]{5})$/{p;b} 
     /^([0-9]{9}) /{h;b} 
     /([0-9]{5})$/{x;G; s/\n//; p}' 

है या, छोटे, लेकिन शायद कम पठनीय:

sed -nr 's/\r?$//; /^([0-9]{9}) /{/ ([0-9]{5})$/{p;b};h;b};/ ([0-9]{5})$/{x;G; s/\n//; p}' 

मैं उम्मीद करते हैं पहले एक तेजी से होता है कि, क्योंकि सबसे लगातार परीक्षण (के लिए पूर्ण लाइनों) में केवल एक ही रेगेक्स शामिल है, जबकि दूसरी (छोटी) स्क्रिप्ट, सबसे लगातार परीक्षण के लिए दो रेगेक्स परीक्षण की आवश्यकता होती है।

यह मुझे आउटपुट मिलता है; का उपयोग कर GNU sed 4.2.1

512161000 EN5121 K. K. Jorge Institute of Engineering Education and Research, Nashik 61220 Mechanical Engineering [Second Shift] XOPENH 1 116 16978 
517261123 EN5172 R. C. Rustom Institute of Technology, Shirpur 61220 Mechanical Engineering [Second Shift] YOPENH 1 100 29555 
617561234 EN6175 abc xyz Education Trust, abc xyz College of Engineering,Pune 61220 enter code hereMechanical Engineering [Second Shift] ZOPENH 2 105 25017 
112724510 EN1127 Jagadambha Bahuuddeshiya Gramin Vikas Sanstha's Jagdambha College of,Engineering and Technology, Yavatmal 24510 Computer Engineering LSCO 1 55 93531 
+0

# प्रश्न में दिखाए गए उदाहरणों के साथ काम नहीं करता है। ## sed संस्करण 4.1.5 – shantanuo

+0

यह अजीब बात है; यह मेरे लिए काम करता है (मैंने जवाब देने के लिए आउटपुट और sed संस्करण जोड़ा है) .. क्या यह एक त्रुटि संदेश देता है, या सिर्फ वांछित आउटपुट का उत्पादन नहीं करता है? (हो सकता है कि यह विस्तारित regex swithc '-r' ??) –

+0

फ़ाइल में सामान्य * nix' \ n' न्यूलाइन (बनाम विंडोज़ '\ r \ n' या शायद पुराना मैक 'r' भी हो)? Windows उत्पन्न फ़ाइलों को संसाधित करते समय, मैंने पहले समस्याओं में भाग लिया है। –

0

शायद इसलिए की तरह, सभी लाइन टूट जाता है कि अल्पविराम के बाद हो दूर करने की कोशिश:

perl -i -pe 's/,\n/,/g' file.txt 

शायद आप अल्पविराम के बाद रिक्त स्थान के लिए अनुमति देना चाहते हैं: मान लिया जाये कि

perl -i -pe 's/(,\s*)\n/$1/g' file.txt 
+1

लाइन ब्रेक काम नहीं करता है आवश्यक नहीं है होते हैं अल्पविराम के बाद। – shantanuo

1

अपने डेटा "file.txt" में है, यहां एक स्कैन है जो लाइनों को एकसाथ वापस रखेगा:

cat file.txt | perl -ne 'chomp; if (/^\d{9}/) { print "\n$_" } else { print "$_\n" }' 

यह मानता है कि सभी वैध रिकॉर्ड 9 अंकों की संख्या से शुरू होते हैं। "चॉम्प" प्रारंभ में नई लाइन को हटा देता है, और पैटर्न तय करता है कि आउटपुट में एक नई लाइन कब दिखाई देनी चाहिए।

1

यह आप के लिए काम कर सकते हैं:

sed ':a;$!N;/ [0-9]\{5\}\n[0-9]\{9\} /!s/\n//;ta;P;D' file 

स्पष्टीकरण:

  • लाइन एक अंतरिक्ष पाँच अंक के बाद नौ अंक हैं और फिर बाद में खत्म नहीं होता तो एक जगह, नई लाइन को हटा दें।

संपादित करें:

टेस्ट डेटा:

cat <<\! >/tmp/codel.txt 
> 112724510 EN1127 Jagadambha Bahuuddeshiya Gramin Vikas Sanstha's Jagdambha College of, 
> Engineering and Technology, Yavatmal 24510 Computer Engineering LSCO 1 55 93531 
> ! 
sed ':a;$!N;/\s[0-9]\{5\}\n[0-9]\{9\}\s/!s/\n//;ta;P;D' /tmp/codel.txt 
112724510 EN1127 Jagadambha Bahuuddeshiya Gramin Vikas Sanstha's Jagdambha College of,Engineering and Technology, Yavatmal 24510 Computer Engineering LSCO 1 55 93531 
sed ':a;$!N;/\s[0-9]\{5\}\n[0-9]\{9\}\s/!s/\n//;ta;P;D' /tmp/{codel.txt,codel.txt,codel.txt} 
112724510 EN1127 Jagadambha Bahuuddeshiya Gramin Vikas Sanstha's Jagdambha College of,Engineering and Technology, Yavatmal 24510 Computer Engineering LSCO 1 55 93531 
112724510 EN1127 Jagadambha Bahuuddeshiya Gramin Vikas Sanstha's Jagdambha College of,Engineering and Technology, Yavatmal 24510 Computer Engineering LSCO 1 55 93531 
112724510 EN1127 Jagadambha Bahuuddeshiya Gramin Vikas Sanstha's Jagdambha College of,Engineering and Technology, Yavatmal 24510 Computer Engineering LSCO 1 55 93531 
+0

फ़ीड करते हैं, उपर्युक्त दूसरे उदाहरण के साथ काम नहीं कर रहा है। प्रश्न अपडेट किया गया। – shantanuo

+0

@shantanuo ने आपके नए डेटा का उपयोग करके परीक्षण किया (EDIT देखें) मुझे ठीक लगता है। – potong

0

इस

sed '/^[0-9]\{9\}/{h;};/^[0-9]\{9\}/!{x;G;s/\n//g;}' test | grep -E '[0-9]{5}$' 
+0

प्रश्न में दिखाए गए पहले उदाहरण फ़ाइल के साथ काम नहीं करता है। – shantanuo

0
awk '! ($1 ~ /^[[:digit:]]/) {$0 = save " " $0} $1 ~ /^[[:digit:]]/ {save = $0} $NF ~ /[[:digit:]]$/ {print}' inputfile 
+0

यह दूसरे उदाहरण के साथ काम करता है लेकिन पहले के साथ नहीं। – shantanuo

+0

@ शंतनुओ: पहला वह है जिसे मैंने परीक्षण किया और यह मेरे लिए ठीक काम करता है। साथ ही, जब मैं इसे 'wc -l' पर पाइप करता हूं तो मुझे 3. –

+0

Awk 3.1.5 3 – shantanuo

0
cat todel.txt |awk 'BEGIN {i=0} {first[i]=$1; lines[i++] = $0;} END {for (x=0; x<i; x++) { if (x==(i - 1) || (first[x + 1] ~ /^[0-9]+$/ && length(first[x + 1])==9)) {printf("%s: %s\n", x, lines[x]);} else {printf("%s: %s%s\n", x, lines[x], lines[x + 1]); x++;} } }' 
0

यह मानते हुए वैध रिकॉर्ड खत्म डब्ल्यू द्वारा निर्धारित शामिल डेटा के साथ काम करता कोशिश ith पाँच अंक:

use Modern::Perl; 

my $data = do{local $/; <DATA>}; 
$data =~ s/([^\d]{5})\n/$1 /sg; 
say $data; 


__DATA__ 
512161000 EN5121 K. K. Jorge Institute of Engineering Education and Research, Nashik 61220 Mechanical Engineering [Second Shift] XOPENH 1 116 16978 
517261123 EN5172 R. C. Rustom Institute of Technology, Shirpur 61220 Mechanical Engineering [Second Shift] YOPENH 1 100 29555 
617561234 EN6175 abc xyz Education Trust, abc xyz College of Engineering, 
Pune 61220 Mechanical Engineering [Second Shift] ZOPENH 2 105 25017 
112724510 EN1127 Jagadambha Bahuuddeshiya Gramin Vikas Sanstha's Jagdambha College of, 
Engineering and Technology, Yavatmal 24510 Computer Engineering LSCO 1 55 93531 

आउटपुट:

512161000 EN5121 K. K. Jorge Institute of Engineering Education and Research, Nashik 61220 Mechanical Engineering [Second Shift] XOPENH 1 116 16978 
517261123 EN5172 R. C. Rustom Institute of Technology, Shirpur 61220 Mechanical Engineering [Second Shift] YOPENH 1 100 29555 
617561234 EN6175 abc xyz Education Trust, abc xyz College of Engineering, Pune 61220 Mechanical Engineering [Second Shift] ZOPENH 2 105 25017 
112724510 EN1127 Jagadambha Bahuuddeshiya Gramin Vikas Sanstha's Jagdambha College of, Engineering and Technology, Yavatmal 24510 Computer Engineering LSCO 1 55 935315 
+0

की बजाय 4 लाइनें देता है आपका regex '/ ([^ \ d] {5}) \ n/$ 1/sg; 'होना चाहिए/^ (\ d {9}। *?) (\ n) [^ \ d {5} \ n]/$ 1/gm;' क्योंकि यदि रेखा को 5 अंकों के साथ ** संख्या मिलती है लाइन ** के बीच और यदि लाइन वहां टूट जाती है (जो वास्तव में मामला है) तो आपका रेगेक्स असफल हो जाएगा। पूर्व के लिए: दूसरी पंक्ति में '61220' पर तोड़ने पर विचार करें। –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^