संबंधित फ़ाइलें और फ़ाइलों के बीच नई लाइन डालें


127

मेरे पास कई फाइलें हैं, जिनके साथ मैं चाहता हूं cat। हम कहते हैं

File1.txt 
foo

File2.txt
bar

File3.txt
qux

मैं सम्‍मिलित करना चाहता हूं ताकि अंतिम फ़ाइल इस प्रकार दिखे:

foo

bar

qux

इसके बजाय सामान्य के साथ cat File*.txt > finalfile.txt

foo
bar 
qux

इसे करने का सही तरीका क्या है?


जवाबों:


121

तुम कर सकते हो:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done

सुनिश्चित करें कि finalfile.txtउपरोक्त कमांड चलाने से पहले फ़ाइल मौजूद नहीं है।

यदि आपको उपयोग करने की अनुमति है, awkतो आप कर सकते हैं:

awk 'FNR==1{print ""}1' *.txt > finalfile.txt

10
AWK '{print $0}' *.txt
टिम्बर

7
इसका विशिष्ट दोष है कि अंत में (पहले विकल्प से) या शुरुआत में (दूसरी वैकल्पिक) खाली लाइनें होंगी। आप awk 'FNR==1 && NR > 1 ...'इसके बजाय इसके साथ आसानी से रक्षा कर सकते हैं , हालांकि।
ट्रिपलए

5
आप डाल दिया >finalfile.txtके बाद doneआप संलग्न के बजाय ऊपर लिख सकते हैं, आवश्यकता को हटा देगा जो सुनिश्चित करें कि फ़ाइल याद आ रही है बनाने या पाश से पहले खाली करने के लिए।
ट्रिपलए

53

यदि आपके पास कुछ पर्याप्त फ़ाइलें हैं जिन्हें आप प्रत्येक को सूचीबद्ध कर सकते हैं, तो आप बैश में प्रक्रिया प्रतिस्थापन का उपयोग कर सकते हैं , प्रत्येक जोड़ी फ़ाइलों के बीच एक नई पंक्ति सम्मिलित कर सकते हैं :

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt

1
सुंदर! धन्यवाद।
बॉब कोकिस्को

यह मेरे लिए मेरे Letsencrypt certs .pem फ़ाइलों को बनाने के लिए अच्छी तरह से काम किया।
लेमन 24

35

अगर यह मैं कर रहा था, तो मैं sed का उपयोग करूंगा:

sed -e '$s/$/\n/' -s *.txt > finalfile.txt

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

यदि आपके सीड के संस्करण में -sअलग से प्रक्रिया नहीं है (आप इनपुट फाइल को अलग करते हैं) तो आप इसे लूप के रूप में कर सकते हैं:

for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt

3
या जीएनयू सेड में:sed -s '$G' *.txt > finalfile.txt
रूड हेलडरमैन

केवल एक धारा! यह स्वीकृत उत्तर होना चाहिए!
यासीन एलबदौई

सावधान लोगों, मैं सिर्फ अपने पीसी दुर्घटनाग्रस्त हो गया क्योंकि मैं के findस्थान पर इस्तेमाल किया *.txt, जिसका मतलब था कि फ़ाइल को अपने आप से जोड़ा गया था!
ज़ेरुस

11

यदि आप चाहें तो इसका उपयोग कर xargsसकते हैं, लेकिन मुख्य विचार अभी भी समान है:

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt

1
धन्यवाद। मुझे xargsबैश में छोरों की तुलना में उपयोग करना बहुत आसान लगता है।
रवियोगबाग

9

यह बाश में काम करता है:

for f in *.txt; do cat $f; echo; done

>>(परिशिष्ट) के साथ उत्तर के विपरीत , इस कमांड के आउटपुट को अन्य कार्यक्रमों में पाइप किया जा सकता है।

उदाहरण:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt (parens वैकल्पिक हैं)
  • for ... done | less (कम में पाइपिंग)
  • for ... done | head -n -1 (यह स्ट्रिपिंग ब्लैंक लाइन से स्ट्रिप्स है)

7

यह है कि मैं बस यह कैसे ओएक्सएक्स 10.10.3 पर किया

for f in *.txt; do (cat $f; echo '') >> fullData.txt; done

चूँकि साधारण the प्रतिध्वनि ’आदेश के साथ बिना किसी नई पंक्ति में सम्मिलित हुए कोई परमान समाप्त नहीं हुआ।


यह फ़ाइल के अंत में स्ट्रिंग डालता है; मैं इसे प्रत्येक फ़ाइल के बीच कैसे प्रविष्ट करूँ ?
onassar

3

अजगर में, यह फ़ाइलों के बीच रिक्त लाइनों के साथ समाप्‍त करता है ( ,एक अतिरिक्त अनुगामी रिक्त पंक्ति को जोड़ने वाले शब्‍द):

print '\n'.join(open(f).read() for f in filenames),

यहाँ बदसूरत अजगर वन-लाइनर है जिसे शेल से बुलाया जा सकता है और आउटपुट को एक फाइल में प्रिंट करता है:

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.