Jawaban:
Secara teknis inilah yang seharusnya cat
("digabungkan") dilakukan, walaupun kebanyakan orang hanya menggunakannya untuk menghasilkan file ke stdout. Jika Anda memberikan beberapa nama file, ia akan menampilkan semuanya secara berurutan, dan kemudian Anda dapat mengarahkannya ke file baru; dalam hal semua file cukup gunakan *
(atau /path/to/directory/*
jika Anda belum berada di direktori) dan shell Anda akan memperluasnya ke semua nama file
$ cat * > merged-file
numeric_glob_sort
opsinya).
Jika file Anda tidak berada di direktori yang sama, Anda dapat menggunakan perintah find sebelum concatenation:
find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
Sangat berguna ketika file Anda sudah dipesan dan Anda ingin menggabungkannya untuk menganalisisnya.
Lebih mudah dibawa:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
Ini mungkin atau mungkin tidak mempertahankan pesanan file.
"*.csv"
, karena shell kemudian akan meneruskan literal *
ke find
.
Perintah
$ cat * > merged-file
sebenarnya memiliki efek samping yang tidak diinginkan dengan memasukkan 'file yang digabungkan' dalam rangkaian, membuat file run-away. Untuk menyelesaikan ini, baik menulis file yang digabungkan ke direktori yang berbeda;
$ cat * > ../merged-file
atau menggunakan pencocokan pola yang akan mengabaikan file yang digabungkan;
$ cat *.txt > merged-file
cat * > merged-file
bekerja dengan baik. Gumpalan diproses sebelum file dibuat. Jika merged-file
sudah ada, cat
(setidaknya milik saya) akan mendeteksi bahwa itu adalah file output dan menolak untuk membacanya. JIKA file tersebut sudah ada DAN Anda memiliki pengalihan nanti di dalam pipa, maka jelas tidak bisa melakukan itu, maka kemudian dan hanya Anda mendapatkan file runaway.
cat
tidak memiliki cara untuk mendeteksi apakah file tersebut adalah file output. Pengalihan terjadi di shell; cat
hanya mencetak pada stdout.
Seperti yang lain dari sini katakan ... Anda dapat menggunakan cat
Katakanlah Anda memiliki:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
Dan Anda ingin hanya file01
untuk file03
dan fileA
untuk fileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
Atau, menggunakan ekspansi brace:
cat ~/file0{1..3} ~/file{A..C} > merged-file
Atau, menggunakan ekspansi brancier yang lebih menarik:
cat ~/file{0{1..3},{A..C}} > merged-file
Atau Anda dapat menggunakan for
loop:
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
[01-03]
tidak akan berfungsi sebagai pola globbing.
Anda dapat menentukan pattern
file kemudian menggabungkan semuanya sebagai berikut:
cat *pattern* >> mergedfile
Pilihan lain adalah sed:
sed r 1.txt 2.txt 3.txt > merge.txt
Atau...
sed h 1.txt 2.txt 3.txt > merge.txt
Atau...
sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
Atau tanpa pengalihan ...
sed wmerge.txt 1.txt 2.txt 3.txt
Perhatikan bahwa baris terakhir tulis juga merge.txt (bukan wmerge.txt!). Anda dapat menggunakan w "merge.txt" untuk menghindari kebingungan dengan nama file, dan -n untuk output diam.
Tentu saja, Anda juga dapat mempersingkat daftar file dengan wildcard. Misalnya, dalam kasus file bernomor seperti dalam contoh di atas, Anda dapat menentukan rentang dengan kawat gigi dengan cara ini:
sed -n w"merge.txt" {1..3}.txt
*
dalam urutan "alami". Jika Anda memiliki "file1.txt ... file9.txt ... file14.txt" itu tidak akan berfungsi karena file1? .Txt akan mengurutkan antara file1.txt dan file2.txt. Anda harus mengubah nama mereka menjadi "file01.txt ... file09.txt ... file14.txt". Katakanecho *
jika Anda tidak yakin.