2010-04-05 27 views
23

Tôi đang sử dụng cat * .txt để hợp nhất nhiều tệp txt thành một tệp, nhưng tôi cần mỗi tệp phải nằm trên một dòng riêng biệt.Linux: Hợp nhất nhiều tệp, mỗi tệp trên một dòng mới

Cách tốt nhất để hợp nhất các tệp với mỗi tệp xuất hiện trên một dòng mới là gì?

+0

'cat' nào đó theo mặc định. –

+7

@ Dennis Williamson: Không phải vậy. Hãy thử 'echo -n a> a.txt; echo -n b> b.txt; cat a.txt b.txt'. – ephemient

+0

@ephemient: 'echo" một số văn bản "> text.txt; tệp text.txt; echo -n "some text"> text.txt; tệp text.txt' –

Trả lời

35

chỉ cần sử dụng awk

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

Yêu thích điều này. Tôi đã điều chỉnh nó để tạo ra một chú thích để tôi có thể cho biết mỗi phần của tập tin mới đến từ đâu: awk 'FNR == 1 {printf ("#% s \ n", ARGV [ARGIND])} 1' Cảm ơn bạn đã giới thiệu tôi phải ngượng ngùng. Tôi đang kết hợp các tập tin .coffee vì vậy tôi có thể tránh cà phê --merge và do đó có được một bản đồ nguồn làm việc. – Julian

+1

Đề xuất chỉnh sửa sau để không bao gồm ngắt dòng ở đầu kết quả: 'awk 'FNR == 1 && NR! = 1 {print" "} 1' * .txt' –

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

Bạn có thể lặp qua từng tập tin với một vòng lặp for:

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

Điều này sẽ làm tắc nghẽn các tệp có dung lượng trong tên tệp. –

+0

@IgnacioVazquezAbrams - cảm ơn lời nhắc nhở (Tôi không sử dụng dấu cách trong tên của mình vì vậy tôi thường quên điều đó). Dù sao, tôi đã cập nhật ví dụ của tôi để xử lý đúng cách. –

+0

Tôi chọn giải pháp awk, nhưng điều này chắc chắn sẽ hữu ích cho các kịch bản khác. Cảm ơn. – Marco

6

Tôi giả sử bạn muốn ngắt dòng giữa các tập tin.

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

Nếu bạn có một paste hỗ trợ nó,

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

làm một công việc thực sự tuyệt vời

+2

Đây là một trong những phương pháp nhanh nhất của tệp concatenation Tôi đã từng thử nghiệm. Ý tưởng hay ... – retrography

+0

Giải pháp tốt nhất của IMO. Cả hai '-d' và' -s' đều được chỉ định posix, do đó không nên có một 'dán' không hỗ trợ chúng. Giải pháp này thực sự cần nhiều phiếu bầu hơn. – kralyk

+0

+1 tuyệt vời! cảm ơn rất nhiều. câu hỏi chính xác tôi đã có và ans hoàn hảo! – KillBill

Các vấn đề liên quan