2010-04-05 8 views
23

मैं बिल्ली * .txt का उपयोग कर रहा हूं ताकि एकाधिक txt फ़ाइलों को एक में मर्ज किया जा सके, लेकिन मुझे प्रत्येक फ़ाइल को एक अलग पंक्ति पर होना चाहिए।लिनक्स: एकाधिक फ़ाइलों को विलय करना, प्रत्येक नई लाइन

नई फ़ाइल पर दिखाई देने वाली प्रत्येक फ़ाइल के साथ फ़ाइलों को मर्ज करने का सबसे अच्छा तरीका क्या है?

+0

'cat' डिफ़ॉल्ट रूप से करता है कि नहीं करता है। –

+7

@ डेनिस विलियमसन: नहीं, ऐसा नहीं है। 'Echo -n a> a.txt आज़माएं; echo -n b> b.txt; बिल्ली a.txt b.txt'। – ephemient

+0

@ephemient: कुछ पाठ "echo" "text.txt; फ़ाइल text.txt; echo -n "कुछ पाठ"> text.txt; फ़ाइल text.txt' –

उत्तर

35

सिर्फ awk

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

इसे प्यार करें। मैंने इसे एक टिप्पणी तैयार करने के लिए अनुकूलित किया ताकि मैं बता सकूं कि नई फ़ाइल के प्रत्येक अनुभाग से कौन सी फाइल आई थी: awk 'FNR == 1 {printf ("#% s \ n", ARGV [ARGIND])} 1' परिचय के लिए धन्यवाद मुझे अजीब मैं। कॉफी फाइलों का संयोजन कर रहा हूं इसलिए मैं कॉफी के सेमेज से बच सकता हूं और इस तरह एक कामकाजी स्रोत मानचित्र प्राप्त कर सकता हूं। – Julian

+1

निम्नलिखित संपादन का सुझाव देगा कि परिणामों के शीर्ष पर एक लाइन ब्रेक शामिल न करें: 'awk' FNR == 1 && NR! = 1 {print ""} 1 '* .txt' –

7
for file in *.txt 
do 
    cat "$file" 
    echo 
done > newfile 
17

आप पाश के लिए एक साथ एक फ़ाइल के माध्यम से पुनरावृति कर सकते हैं:

for filename in *.txt; do 
    # each time through the loop, ${filename} will hold the name 
    # of the next *.txt file. You can then arbitrarily process 
    # each file 
    cat "${filename}" 
    echo 

# You can add redirection after the done (which ends the 
# for loop). Any output within the for loop will be sent to 
# the redirection specified here 
done > output_file 
+1

यह उन फाइलों पर चकित होगा जिनके पास फ़ाइल नाम में एक स्थान है। –

+0

@IgnacioVazquezAbrams - अनुस्मारक के लिए धन्यवाद (मैं अपने नामों में रिक्त स्थान का उपयोग नहीं करता इसलिए मैं आमतौर पर इसे भूल जाता हूं)। वैसे भी, मैंने इसे ठीक से संभालने के लिए अपना उदाहरण अपडेट कर दिया है। –

+0

मैंने अजीब समाधान उठाया, लेकिन यह निश्चित रूप से अन्य स्क्रिप्ट के लिए उपयोगी होगा। धन्यवाद। – Marco

6

मैं यह सोचते करती हूं कि आप फ़ाइलों के बीच एक लाइन ब्रेक चाहते हैं।

for file in *.txt 
do 
    cat "$file" >> result 
    echo >> result 
done 
23

का उपयोग आप एक paste है कि यह समर्थन करता है है, तो

paste --delimiter=\\n --serial *.txt 

एक बहुत अच्छा काम

+2

यह फ़ाइल के सबसे तेज़ तरीकों में से एक है concatenation मैंने कभी परीक्षण किया है। महान विचार ... – retrography

+0

आईएमओ सबसे अच्छा समाधान। '-d' और' -s 'दोनों पॉिक्स-निर्दिष्ट हैं, इसलिए उन्हें' पेस्ट 'नहीं होना चाहिए जो उनका समर्थन नहीं कर रहा है। इस समाधान को वास्तव में अधिक वोट चाहिए। – kralyk

+0

+1 उत्कृष्ट! बहुत - बहुत धन्यवाद। मेरे पास सही सवाल था और सही जवाब! – KillBill

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