2011-12-17 10 views
12

मुझे उपरोक्त रेखा तक प्रत्येक दूसरी पंक्ति की सामग्री को स्थानांतरित करने की आवश्यकता है, जैसे लाइन 2 का डेटा लाइन 1 के साथ है, या तो अल्पविराम या अंतरिक्ष अलग-अलग काम करता है।मैं विम, sed, या किसी अन्य समान उपकरण का उपयोग कर एक बड़ी फ़ाइल (1 मिलियन लाइनों) में लगातार लाइनों के जोड़ों में कैसे शामिल हो सकता हूं?

इनपुट:

line1 
line2 
line3 
line4 

आउटपुट:

line1 line2 
line3 line4 

मैं एक साधारण रिकॉर्डिंग के साथ vim में यह कर रहा हूँ लेकिन vim दुर्घटना जब मैं यह बताना यह 100 000 बार कर रहा है। .. मुझे लगता है कि शायद एक अच्छा विकल्प होगा लेकिन यकीन नहीं है कि मैं क्या करना चाहता हूं या शायद एक बेहतर विकल्प है? एक लाख

प्रत्येक पंक्ति केवल 1 संख्यात्मक मूल्य होता है, मैं तो बस है लाइनों ...

+1

अपने प्रश्न फ़ॉर्मेट करें, और हमें उचित इनपुट को दिखाने के लिए और अपेक्षित उत्पादन। –

उत्तर

14

अगर मैं सही ढंग से समझ, तुम हो:

और आप चाहते हैं:

line1<SEP>line2 
line3<SEP>line4 

तो आप इसे (g)awk के साथ आसानी से कर सकते हैं:

awk 'NR % 2 == 1 { o=$0 ; next } { print o "<sep>" $0 }' INPUTFILE 

See it in action here

अद्यतन: अगर लाइनों की संख्या विषम है, इसके बाद के संस्करण अंतिम पंक्ति छोड़ दी जाएगी (मार्टिन Stettner ने बताया) तो यह कार्य नहीं करेंगे:

awk 'NR % 2 == 1 { o=$0 ; next } { print o "<sep>" $0 } END { if (NR % 2 == 1) { print o } }' INPUTFILE 

HTH

+1

यदि आपके पास लाइनों की विषम संख्या है तो क्या यह स्क्रिप्ट अंतिम पंक्ति को छोड़ नहीं देगी? – MartinStettner

+0

@ मार्टिनस्टेटनर आप सही हैं। समाधान अद्यतन कर रहा है। –

7

इस प्रयास करें: seq साथ

sed -rn 'N;s/\n/ /;p' yourFile 

परीक्षण:

kent$ seq 10 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

kent$ seq 10|sed -rn 'N;s/\n/ /;p' 
1 2 
3 4 
5 6 
7 8 
9 10 

awk भी काम करता है:

awk 'NR%2{printf $0" ";next;}1' yourFile 

परीक्षण

kent$ seq 10|awk 'NR%2{printf $0" ";next;}1' 
1 2 
3 4 
5 6 
7 8 
9 10 
6

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

sed 'N;s/\n/ /' file 

या

cat file | paste -d' ' - - 
6

वैसे आपका उदाहरण विम में है।

:g/^/+t.|-j

लेकिन तब क्या अंतिम पंक्ति के बारे में?

या क्या आपका यह मतलब था?

:g/^/j 

इस Vim स्क्रिप्ट है, जो बड़ी फ़ाइलों को आसान बनाता है के साथ काम कर में रुचि हो सकती।

http://www.vim.org/scripts/script.php?script_id=1506

+0

हाय, वाह, मुझे पता था कि मैं कोशिश कर रहा था उससे बेहतर तरीका होना चाहिए !! :) विकल्पों के भार के लिए धन्यवाद,: जी/^/जे सबसे सरल था और नौकरी महान है! – janeruthh

+0

उपर्युक्त उपरोक्त स्पष्टीकरण के बाद ओपी संपादित किया गया। मेरे उत्तर में पहला सुझाव अब अनदेखा किया जा सकता है। – 1983

+0

ग्रेट विम टिप! मेरे मामले में, पूरी फ़ाइल नहीं थी, इसलिए दृश्य चयन ': '<,'> g/^/j' या _a mark_ और वर्तमान पंक्ति': 'a, .g/^/j' के बीच सीमा तक उपयोग कर सकते हैं ब्याज की मेरी सीमा में शामिल होना। इसे 773 बार मैन्युअल रूप से कर रहा है! – ddevienne

2
$ seq 10 | sed '2~2G' | awk -v RS='' '{$1=$1; print}' 
1 2 
3 4 
5 6 
7 8 
9 10 

$ paste -d' ' <(sed -n 'p;n' num.txt) <(sed -n 'n;p' num.txt) 
1 2 
3 4 
5 6 
7 8 
9 10 

$ echo -e 'g/^/,+1j\n%p' | ex num.txt 
1 2 
3 4 
5 6 
7 8 
9 10 

$ seq 10 | awk 'NR%2{printf("%s ", $0); next}1' 
1 2 
3 4 
5 6 
7 8 
9 10 

$ seq 10 | sed 'N;s/\n/ /' 
1 2 
3 4 
5 6 
7 8 
9 10 

ध्यान दें:$ seq 10 >num.txt

+0

'perl' के बारे में कैसे? 'सीईसी 10 | perl -pe '$ a ++% 2 || s/\ n//' ' – Sorpigal

5

पेस्ट आदेश कर सकते हैं। इसका "-s" विकल्प लगातार लाइनों में शामिल होगा; और "-d" विकल्प वर्णक के रूप में उपयोग करने के लिए वर्णों की एक सूची निर्दिष्ट करता है, जो उन्हें चक्रीय रूप से दोहराता है। एक नई पंक्ति के साथ एक स्थान के साथ पहले से जुड़ें, फिर, और दोहराने:

seq 10 | paste -sd" \n" - 
0
seq 10 | awk 'ORS=NR%2?FS:RS' 

यह समाधान "त्रिगुट ऑपरेटर" का उपयोग करता है सेट ORS

ORS= ....... output register separator (will receive =) 
NR%2 ....... test if it has division remainder of Number of Register by 2 
?FS:RS ..... FS = "space" RS = "\n" (newline) 
संबंधित मुद्दे

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