मैं टेक्स्ट फ़ाइल में सभी पंक्तियों को एक पंक्ति में कैसे संयोजित करूं?


28

मैं एक पाठ में सभी पंक्तियों को एक पंक्ति में लाना चाहता हूं। मैं कोडिंग में एक शुरुआत कर रहा हूँ जो करके सीखने की कोशिश कर रहा हूँ। मैंने इस समस्या को हल करने के लिए चार घंटे बिताए हैं। मुझे पता है कि इस समस्या का एक सरल समाधान है। यहाँ मैं कोशिश कर रहा हूँ।

sed -e 'N; s / \ n //' myfile.txt # कुछ भी नहीं

sed -e: a -e N -e 's / \ n /' -e ta myfile.txt #output सब गड़बड़ हो गया और मैं सिंटैक्स का सिर और पूंछ नहीं बना सकता

cat myfile.txt | tr -d '\ n'> myfile.txt # सभी लाइनों को हटाता है

यहाँ पाठ फ़ाइल है:

500,212
262578-4-4
23200
ग्रिफिथ लैबोरेटरीज लि
ग्रिफ़िट लैबोरेटरीज
दक्षिण डबली COUNCIL
कार्यालय
कार्यालय (औद्योगिक)
सूचीबद्ध करने योग्य
2 पाइनव्यू औद्योगिक एस्टेट
फायरहाउस रोड
Knocklyon
31 दिसंबर 2007
01 जनवरी 2008 "   

मैं यह पता नहीं लगा सकता कि मैं कहाँ गलत हो गया हूँ ...।

जवाबों:


31

trजैसा कि आपने उपयोग किया है यह काम करना चाहिए और सबसे सरल है - आपको बस किसी अन्य फ़ाइल में आउटपुट करने की आवश्यकता है । यदि आप आउटपुट के रूप में इनपुट फ़ाइल का उपयोग करते हैं, तो परिणाम एक खाली फाइल है जैसा आपने देखा;

cat myfile.txt | tr -d '\ n'> oneline.txt

आपको याद रखना चाहिए कि कुछ संपादकों के साथ एक पंक्ति समाप्त हो गई है \r\n। उस स्थिति के लिए, का उपयोग करें

cat myfile | tr -d '\r\n'

आपकी मदद के लिए धन्यवाद, लेकिन यह अभी भी काम नहीं कर रहा है। मुझे पता है कि यह बुनियादी और सरल है। आपके द्वारा दी गई कमांड ने सभी लाइनें हटा दी हैं। मैं फ़ाइल को पोस्ट करने जा रहा हूँ 500212 262578-4-4 23200 ग्रिफ़िथ लैबोरेटरीज लिमिटेड ग्रिफ़िट लैबोरेटरीज दक्षिण डबली काउंटी कार्यालय कार्यालय (औद्योगिक) सूची रटनीय / पाइनव्यू इंडस्ट्रियल एस्टेट फ़िरहाउस रोड नॉकलाइन 31 दिसंबर 2007 01 जनवरी 2008
जॉन

@ जोहान: परिणाम या त्रुटि क्या है?
ish

मैं अपना उत्तर संपादित करके पोस्ट करने जा रहा था। कमांड का उपयोग करने के बाद फाइल खाली थी। टर्मिनल में ऐसा दिखता था "cat reval_details.asp? Pno = 500211.txt | tr -d '\ n'> reval_details.asp? Pno = 500211.txt"। एक बार फिर धन्यवाद।
जॉन

@ जॉन: आप एक ही आउटपुट फ़ाइल नाम का उपयोग नहीं कर सकते हैं !! (उत्तर देखो)। कृपया कोशिश करेंcat reval_details.asp?Pno=500211.txt | tr -d '\n' > new_reval_details.asp?Pno=500211.txt
ish

1
ऐसा करने का एक बेहतर तरीका होगा tr -d '\n' <input.txt > output.txt- जो बिल्ली के बेकार उपयोग से बचता है, और एक कम अनावश्यक पाइप का उपयोग करता है।
evilsoup

8

यही पर है। यह एक और उपाय है और सरल आसान है।

echo $(cat Input.txt) > Output.txt

2
मुझे विश्वास नहीं होता कि यह काम किया, भयानक
mchid

echo `cat Input.txt` > Output.txt भी काम करता है, बस एक और प्रकार
raider33

यदि किसी एक मंडल में एक से अधिक श्वेत रिक्त स्थान (स्पेस, टैब, न्यूलाइन और इतने ही) हैं तो वे एक स्थान से बदल जाएंगे।
इगू

यह एक अच्छा समाधान है, लेकिन मेरे कंप्यूटर पर, मैंने पाया कि trसमाधान के रूप में काम करने में लगभग तीन गुना समय लगता है ।
एलएस

3

सरल विधि

Awk का उपयोग करते हुए एक अन्य विधि,

cat myfile.txt | awk '{print}' ORS=''

आउटपुट:

500212262578-4-423200GRIFFITH लैबोरेटरीज लि।

ध्यान दें:

ORS = '' -> यह आपका क्षेत्र विभाजक है, आप एकल कोट्स के बीच के क्षेत्र विभाजक के रूप में कोई भी वर्ण हो सकते हैं। इस awk विधि का उपयोग करके हम रिक्त स्थान और सभी वर्ण शामिल कर सकते हैं।

आशा है कि यह मदद कर सकता है!


1
ORS आउटपुट रिकॉर्ड सेपरेटर है। OFS आउटपुट फील्ड सेपरेटर है। देखें thegeekstuff.com/2010/01/... याman awk
बड़ी गीक

3

लेबल :aको मुख्य निर्देश के बाहर रखने की आवश्यकता नहीं है , न ही -eविकल्प की आवश्यकता है; अंत में, शानदार /$/है (हर पंक्ति में एक ईओएल चरित्र है)।

अन्य उत्तरों में सुधार, एक हो जाता है

sed -i ':a; N; s/\n/ /; ta' file

जो स्पष्ट है यदि इस प्रकार लिखा जाए,

sed -i ':a
        N
        s/\n/ /
        ta' file

आदेश निम्नानुसार काम करता है:

  1. N अगली लाइन को (बहुस्तरीय) पैटर्न स्पेस में जोड़ता है, जिसमें पहले से ही मौजूद लाइन होती है;
  2. s/\n/ /स्थान के साथ \nउत्पन्न न्यूलाइन वर्ण को स्थानापन्न करें ;N
  3. ta:a जब तक चरण 2 में प्रतिस्थापन के रूप में लेबल के बाद स्क्रिप्ट लाइन पर जाता है, तब तक सफल रहा , यानी यदि प्रतिस्थापन हुआ, तो निष्पादन स्क्रिप्ट के अंत को "1" किए बिना चरण 1 पर कूद जाता है, अर्थात इनपुट की दूसरी पंक्ति को पढ़े बिना

निम्नलिखित पर ध्यान दें;

  • sedपहली पंक्ति से शुरू करके क्रम में एक-एक करके इनपुट फ़ाइल की पंक्तियों को पढ़ता है ;
  • :a सिर्फ एक लेबल है, जिसे निष्पादित करने की आज्ञा नहीं है;
  • N सिद्धांत रूप में, किसी भी लाइन पर निष्पादित किया जाता है, लेकिन
  • s/\n/ /(सिद्धांत में किसी भी लाइन पर निष्पादित) किसी भी लाइन पर सफल होता है , लेकिन आखिरी
  • taस्क्रिप्ट की समाप्ति केवल तभी होती है जब इनपुट की अंतिम पंक्ति पढ़ी जाती है (केवल एक पंक्ति जहां sविफल होती है), इसलिए
  • कोई आगे इनपुट लाइन के बाद पैटर्न अंतरिक्ष में पढ़ा जाता है 1 एक इसे में पढ़ा जाता है जब तक, पिछले एक में पढ़ने के लिए है, लेकिन फिर वहाँ में पढ़ने के लिए आगे कोई लाइन है, और अंतर्निहित pआदेश निष्पादित किया जाता है।

इसलिए स्क्रिप्ट मूल रूप से इनपुट की पहली पंक्ति में पढ़ती है और एक-एक करके नई लाइनों को प्रतिस्थापित करते हुए हर बार एक-एक करके निम्नलिखित पंक्तियों को जोड़ती रहती है; अंतिम पंक्ति को जोड़ने के बाद (और \nएक स्थान में बदल दिया गया है), Nकिसी भी रेखा को जोड़ नहीं सकता है, sविफल रहता है, taछोड़ दिया जाता है, स्क्रिप्ट के अंत तक पहुँच जाता है, और निहित pरिन्ट स्टेटमेंट को वर्तमान लूंग 1-लाइन पैटर्न स्पेस पर निष्पादित किया जाता है ।

-iविकल्प इनपुट फ़ाइल विकल्प fileपूरे 1-लाइन पैटर्न अंतरिक्ष के साथ।


2

जीएडिट:

\nएक स्थान '' के साथ खोजें और बदलें ।
आप 'खोज' -> 'बदलें'
या की-बोर्ड शॉर्टकट Ctrl+ पर जाकर प्रतिस्थापित विंडो प्राप्त कर सकते हैंH

नीचे स्क्रीनशॉट देखें:

आपका मूल पाठ 1-14 की तर्ज पर है।
परिणाम 16 लाइन पर है।

यहाँ छवि विवरण दर्ज करें



1

इसे इस्तेमाल करे

sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]

http://anandsekar.github.io/joining-all-lines-in-a-file-using-sed/


2
क्या आप इन सभी स्विचों के बारे में अधिक जानकारी / स्पष्टीकरण दे सकते हैं? यह बेहतर समझ सकता है कि यह क्यों काम कर रहा है या नहीं।
बेनोइट

0

मुझे लगता है कि आप केवल यह भूल रहे थे कि आपको वांछित परिणाम, newfile.txt को अपनेfile.txt के आउटपुट को रीडायरेक्ट करने के लिए sed को बताने की आवश्यकता है। यह कमांड आपको जरूरत है प्रतीत होता है, लेकिन केवल तभी जब आप जिन फ़ाइलों को मर्ज करने के लिए कोशिश कर रहे हैं sed के बफ़र्स के लिए बहुत बड़ा नहीं हैं: sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txtयहां एक और मंच का श्रेय , जहां वे sed की क्षमताओं पर चर्चा करते हैं। मैंने कमांड का परीक्षण किया है और इसने मेरे लिए काम किया है।


1
दरअसल, स्विच के साथ sed-i मूल फ़ाइल इनलाइन को संशोधित करेगा , इसलिए किसी अन्य फ़ाइल में आउटपुट की आवश्यकता नहीं है। हालांकि सावधान रहें!
ish

मैंने sed -e की कोशिश की: a -e N -e 's / \ n /' -e ta Reval_dails.asp? Pno = 500214.txt 01 Jan 2008addustrial Estate sed -i: a -e Ne-s / \? n / / '-e ta Reval_details.asp? Pno = 500214.txt sed: a' sed -i :a -e N -i 's/\n/ /' -e ta reval_details.asp?Pno=500214.txt sed: can't find label for jump to ' sed -e: a -e N -i 's / \ n /' -e ta reval_details के लिए कूदने के लिए लेबल नहीं मिल सकता है .asp; Pno = 500214.txt sed: s / \ n / / नहीं पढ़ सकता: ऐसी कोई फ़ाइल या निर्देशिका # विचार नहीं है।
जॉन

@ मैं अभी भी कोई भाग्य नहीं था, लेकिन उत्तर के लिए धन्यवाद।
जॉन

मैंने आपके पाठ को एक पाठ संपादक में कॉपी और पेस्ट किया और फ़ाइल को सहेजा और फिर मेरी sed कमांड का उपयोग किया और यह नैनो में खोले जाने पर एक पंक्ति में दिखाई देता है; हालाँकि यदि आप टर्मिनल में बिल्ली का उपयोग करके फ़ाइल खोलते हैं तो इसे लपेटा जाएगा और यह केवल एक पंक्ति प्रतीत नहीं होगी, इसलिए शायद यही हो रहा है। इसके अलावा, आपको 'sed से पहले' की आवश्यकता नहीं है और मुझे लगता है कि आपने ऊपर कमांड में कुछ अन्य अनावश्यक तत्व जोड़े हैं, इसलिए sed -e आज़माएँ: a -e N -e 's / \ n /' -e ta yourfile.txt> newfile.txt यह रेखा इतनी लंबी है कि यह स्क्रीन पर लिपटी हुई दिखाई देगी, हालाँकि, जब तक आपके पास 30 इंच का मॉनिटर न हो!

@ माय चीयर्स फॉर द पोस्ट। मैंने अपना डेटा एक टेक्स्ट एडिटर में टाइप किया और उसे 'sed -e: a -e N -e' s / \ n / '-e ta abc.txt> abc1.txt' नाम से चलाया और यह काम किया। पूरी तरह से। हलिलुय। मैंने तब 'sed -e: a -e N -e' s / \ n / '-e ta reval_details.asp? Pno = 500215.txt> Pno = 500215.txt' टाइप किया और हर लाइन को पहले से अलग किया था? अंतरिक्ष लाइन की शुरुआत में जोड़ा गया। मैं आपके द्वारा डाले गए प्रयास की सराहना करता हूं, लेकिन मुझे लगता है कि मैं ऑक्टेव की ओर बढ़ूंगा और वहां डेटा की कोशिश और प्रक्रिया करूंगा।
जॉन

0

शुद्ध बैश समाधान:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt

0

अगर यह मैं होता तो मैं इसे सिर्फ खोल देता और कुछ बार Shift+ दबा देता J



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