Câu trả lời:
Đây là về mặt kỹ thuật cat
("concatenate") được cho là 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 /path/to/directory/*
nếu bạn chưa có trong thư mục) và trình bao của bạn sẽ mở rộng nó sang tất cả các tên tệp
$ cat * > merged-file
numeric_glob_sort
tùy chọn của nó ).
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.
"*.csv"
, vì trình bao sau đó sẽ chuyển nghĩa đen *
sang find
.
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 vòng 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
cat * > merged-file
hoạt động tốt Globs được xử lý trước khi tập tin được tạo ra. Nếu merged-file
đã tồn tại, cat
(ít nhất là của tôi) sẽ phát hiện ra rằng đó là tệp đầu ra và từ chối đọc nó. NẾU tệp đã tồn tại VÀ bạn có chuyển hướng sau này trong đường ống, thì rõ ràng nó không thể làm điều đó, vì vậy và sau đó bạn mới nhận được tệp chạy.
cat
không có cách nào để phát hiện nếu tập tin là đầu ra. Sự chuyển hướng xảy ra trong vỏ; cat
chỉ in trên thiết bị xuất chuẩn.
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 muốn chỉ file01
đến file03
và fileA
để fileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
Hoặc, sử dụng mở rộng cú đú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 for
vòng lặp:
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
[01-03]
sẽ không hoạt động như một mô hình toàn cầu.
Bạn có thể chỉ định pattern
tệp của một tệp sau đó hợp nhất tất cả chúng như sau:
cat *pattern* >> mergedfile
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 với dấu ngoặc theo cách này:
sed -n w"merge.txt" {1..3}.txt
*
theo thứ tự "tự nhiên". Nếu bạn có "file1.txt ... file9.txt ... file14.txt" thì nó sẽ không hoạt động vì file1? .Txt sẽ sắp xếp giữa file1.txt và file2.txt. Bạn sẽ phải đổi tên chúng thành "file01.txt ... file09.txt ... file14.txt". Nóiecho *
nếu bạn không chắc chắn.