2011-11-18 33 views
66

Tôi có nhiều tệp mà tôi muốn kết hợp với cat. Hãy nói rằngNối các tệp và chèn dòng mới vào giữa các tệp

File1.txt 
foo 

File2.txt 
bar 

File3.txt 
qux 

Tôi muốn concat để các tập tin cuối cùng trông như:

foo 

bar 

qux 

Thay vì điều này với thông thường cat File*.txt > finalfile.txt

foo 
bar 
qux 

đúng cách để làm điều đó là gì?

+2

có thể trùng lặp [Làm cách nào để bao gồm một dòng trống giữa các tệp mà tôi đang ghép nối th "cat"?] (http://stackoverflow.com/questions/1653063/how-do-i-include-a-blank-line-between-files-im-concatenating-with-cat) – legoscia

Trả lời

63

Bạn có thể làm:

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

Đảm bảo rằng tệp finalfile.txt không tồn tại trước khi bạn chạy lệnh trên.

Nếu bạn được phép sử dụng awk bạn có thể làm:

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

'AWK '{ in $ 0} '* .txt' – timger

+3

bởi 'AWK' nghĩa là' awk', đúng không? –

+5

Điều này có lỗ hổng riêng biệt là sẽ có dòng trống ở cuối (từ phương án thay thế đầu tiên) hoặc ở đầu (phương án thứ hai). Bạn có thể dễ dàng bảo vệ chống lại điều này với 'awk' FNR == 1 && NR> 1 ... ''thay vào đó, mặc dù. – tripleee

21

Nếu nó đã được tôi làm việc đó tôi muốn sử dụng sed:

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

Trong mô hình này sed $ có hai nghĩa, trước hết nó chỉ khớp với số dòng cuối cùng (như một loạt các dòng để áp dụng một mẫu trên) và thứ hai nó khớp với phần cuối của dòng trong mẫu thay thế.

Nếu phiên bản của sed không có (tập tin quá trình đầu vào riêng) -s bạn có thể làm điều đó tất cả như một vòng lặp mặc dù:

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

Hoặc trong GNU sed: 'sed -s '$ G' * .txt> finalfile.txt' –

+0

Chỉ một luồng! đây sẽ là câu trả lời được chấp nhận! –

24

Nếu bạn có vài tác phẩm đủ mà bạn có thể liệt kê mỗi một, sau đó bạn có thể sử dụng process substitution trong Bash, chèn một dòng mới giữa mỗi cặp file:

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

Đẹp! Cảm ơn. –

6

đó là cách tôi chỉ làm nó trên OSX 10.10.3

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

vì lệnh 'echo' đơn giản không có tham số nào kết thúc mà không có dòng mới nào được chèn vào.

4

này hoạt động trong Bash:

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

Ngược lại với câu trả lời với >> (append), đầu ra của lệnh này có thể được đường ống vào các chương trình khác.

Ví dụ:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt (dấu ngoặc là không bắt buộc)
  • for ... done | less (đường ống vào ít)
  • for ... done | head -n -1 (này dải ra khỏi dây chuyền trống trailing)
3

Trong python, nó nối với các dòng trống giữa file (các , ngăn chặn bổ sung thêm một trailing dòng trống):

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

Đây là xấu xí python one-liner có thể được gọi từ vỏ và in kết quả vào một tập tin:

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt 
3

Bạn có thể làm điều đó bằng cách sử dụng xargs nếu bạn muốn, nhưng ý tưởng chính vẫn như cũ:

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

Cảm ơn. Tôi thấy 'xargs' dễ sử dụng hơn nhiều so với các vòng lặp. – RawwrBag

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