2009-10-03 8 views
23

एक सरल बैश लिपि मैं इस तरह कई लाइनों के साथ एक पाठ फ़ाइल बनाने के साथ:मैं बैश के साथ एक टेक्स्ट फ़ाइल की हर दो पंक्तियों को कैसे जोड़ूं?

192.168.1.1 
hostname1 
192.168.1.2 
hostname2 
192.168.1.3 
hostname3 

अब मैं इस फ़ाइल को पुन: फ़ॉर्मेट करना चाहते हैं तो यह इस तरह दिखता है:

192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 

मैं कैसे होगा इसे इस तरह से दोबारा सुधारें? शायद sed?

+1

करने के लिए एक और अंतरिक्ष जोड़ने के लिए है, तो आप आप वांछनीय प्रारूप के साथ शुरू में दाखिल क्यों उत्पन्न नहीं करते हैं? – SilentGhost

उत्तर

28
$ sed '$!N;s/\n/ /' infile 
192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 
+0

क्या आप कृपया समझाएंगे कि यह कैसा रहा? – NawaMan

+0

धन्यवाद। बिल्कुल मैं क्या खोजता हूं। :) – fwaechter

+5

@ नवामन: यदि आपका मतलब है "यह कैसे काम करता है?" तो: यदि नहीं (!) अंतिम पंक्ति ($) तो अगली पंक्ति (एन) संलग्न करें और एक स्थान (एस/\ n//) के साथ नई लाइन को प्रतिस्थापित करें और अगली पंक्ति से शुरू करें (जो होगा तीसरा, 5 वां, आदि)। –

30

यहाँ एक खोल-एकमात्र विकल्प है:

while read first; do read second; echo "$first $second"; done 
+1

लेकिन आपको [हमेशा] (http://wiki.bash-hackers.org/commands/builtin/read#read_without_-r) '' read'' के साथ ''-r'' ध्वज का उपयोग करना चाहिए। –

+1

क्या 'done' लाइन को' somefile.txt' किया जाना चाहिए? –

13

मैं इस समाधान

cat infile | paste -sd ' \n' 

192.168.1.1 hostname1 
192.168.1.2 hostname2 
192.168.1.3 hostname3 

या बनाने की सादगी यह अल्पविराम अंतरिक्ष के बजाय अलग अलग

cat infile | paste -sd ',\n' 
प्यार

और यदि आपकी इनपुट फ़ाइल हेक्टेयर है घ टाइमस्टैम्प की तरह एक तीसरी लाइन

192.168.1.1 
hostname1 
14423289909 
192.168.1.2 
hostname2 
14423289910 
192.168.1.3 
hostname3 
14423289911 

उसके बाद ही परिवर्तन सीमांकक सूची

cat infile | paste -sd ' \n' 

192.168.1.1 hostname1 14423289909 
192.168.1.2 hostname2 14423289910 
192.168.1.3 hostname3 14423289911 
+0

यह संक्षिप्त, समझने में आसान है, और बहुत स्केलेबल है। धन्यवाद! – musiphil

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