it-swarm-vi.com

Làm cách nào để hợp nhất tất cả các tệp (văn bản) trong một thư mục thành một?

Tôi đã có 14 tệp tất cả là một phần của một văn bản. Tôi muốn hợp nhất chúng thành một. Làm thế nào để làm điều đó?

99
Ivan

Đây là về mặt kỹ thuật, những gì cat ("concatenate") phải làm, mặc dù hầu hết mọi người chỉ sử dụng nó để xuất các tệp ra thiết bị xuất chuẩn. Nếu bạn cung cấp cho nó nhiều tên tệp, nó sẽ xuất tất cả chúng theo tuần tự, và sau đó bạn có thể chuyển hướng nó thành một tệp mới; trong trường hợp tất cả các tệp chỉ cần sử dụng * (hoặc là /path/to/directory/* nếu bạn chưa có trong thư mục) và Shell của bạn sẽ mở rộng nó thành tất cả tên tệp

$ cat * > merged-file
182
Michael Mrozek

Nếu các tệp của bạn không nằm trong cùng thư mục, bạn có thể sử dụng lệnh find trước khi ghép:

find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file

Rất hữu ích khi các tệp của bạn đã được đặt hàng và bạn muốn hợp nhất chúng để phân tích chúng.


Đáng chú ý hơn:

find /path/to/directory/ -name *.csv -exec cat {} + > merged.file

Điều này có thể hoặc không thể giữ trật tự tập tin.

27
3nrique0

Lệnh

$ cat * > merged-file

thực sự có tác dụng phụ không mong muốn bao gồm 'tập tin hợp nhất' trong phần ghép, tạo ra một tập tin bỏ chạy. Để hoàn thành việc này, hãy ghi tệp đã hợp nhất vào một thư mục khác;

$ cat * > ../merged-file

hoặc sử dụng khớp mẫu sẽ bỏ qua tệp đã hợp nhất;

$ cat *.txt > merged-file
10
Christopher Jones

Giống như những người khác ở đây nói ... Bạn có thể sử dụng cat

Hãy nói rằng bạn có:

~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD

Và bạn chỉ muốn file01 đến file03fileA đến fileC:

cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file

Hoặc, sử dụng mở rộng nẹp:

cat ~/file0{1..3} ~/file{A..C} > merged-file

Hoặc, sử dụng mở rộng niềng răng fancier:

cat ~/file{0{1..3},{A..C}} > merged-file

Hoặc bạn có thể sử dụng vòng lặp for:

for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
10
Florin Idita

Bạn có thể chỉ định pattern của một tệp sau đó hợp nhất tất cả chúng như sau:

cat *pattern* >> mergedfile
0
user182845

Một lựa chọn khác là sed:

sed r 1.txt 2.txt 3.txt > merge.txt 

Hoặc là...

sed h 1.txt 2.txt 3.txt > merge.txt 

Hoặc là...

sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here

Hoặc không có chuyển hướng ...

 sed wmerge.txt 1.txt 2.txt 3.txt

Lưu ý rằng dòng cuối cùng cũng ghi merge.txt (không phải wmerge.txt!). Bạn có thể sử dụng w "merge.txt" để tránh nhầm lẫn với tên tệp và -n cho đầu ra im lặng.

Tất nhiên, bạn cũng có thể rút ngắn danh sách tập tin bằng ký tự đại diện. Ví dụ, trong trường hợp các tệp được đánh số như trong các ví dụ trên, bạn có thể chỉ định phạm vi có dấu ngoặc theo cách này:

sed -n w"merge.txt" {1..3}.txt
0
Harini