Yanıtlar:
Bu teknik olarak ne cat
("bitiştir") yapması gerekiyor, çoğu insan sadece stdout'a dosya çıktılamak için kullanıyor olsa da. Birden fazla dosya adı verirseniz, hepsini sırayla verir ve ardından bunu yeni bir dosyaya yönlendirebilirsiniz; tüm dosyalar için sadece kullanın *
(ya /path/to/directory/*
da zaten dizinde değilseniz) ve kabuğunuz tüm dosya adlarına genişletir.
$ cat * > merged-file
numeric_glob_sort
opsiyonunu ayarlayabilirsiniz )
Dosyalarınız aynı dizinde değilse, birleştirme işleminden önce find komutunu kullanabilirsiniz:
find /path/to/directory/ -name *.csv -print0 | xargs -0 -I file cat file > merged.file
Dosyalarınız zaten sipariş edildiğinde ve onları analiz etmek için birleştirmek istediğinizde çok kullanışlıdır.
Daha taşınabilir:
find /path/to/directory/ -name *.csv -exec cat {} + > merged.file
Bu, dosya sırasını koruyabilir veya koruyamayabilir.
"*.csv"
kabuk sonra hazır bilgi geçerdi beri *
hiç find
.
Komuta
$ cat * > merged-file
aslında birleştirme dosyasına 'birleştirilen dosya' dahil edilmesinin istenmeyen bir yan etkisi vardır, bu bir çalışma dosyası oluşturur. Bunu aşmak için, birleştirilmiş dosyayı farklı bir dizine yazın;
$ cat * > ../merged-file
veya birleştirilmiş dosyayı yoksayacak bir desen eşleşmesi kullanmak;
$ cat *.txt > merged-file
cat * > merged-file
iyi çalışıyor. Globs, dosya oluşturulmadan önce işlenir. Eğer merged-file
zaten var, cat
(en azından benim) o çıktı dosyası olduğunu algılar ve okumak için reddedecektir. Dosya zaten mevcutsa VE daha sonra boru hattında yönlendirmeye sahipseniz, o zaman açıkça yapamazsınız, o zaman ve sonra sadece kaçak dosyayı alırsınız.
cat
Dosyanın çıktı olup olmadığını tespit etmenin bir yolu yoktur. Yönlendirme kabukta olur; cat
sadece stdout'ta yazdırır.
Buradan diğerlerinin dediği gibi ... kullanabilirsiniz cat
Diyelim ki:
~/file01
~/file02
~/file03
~/file04
~/fileA
~/fileB
~/fileC
~/fileD
Ve sadece istemek file01
için file03
ve fileA
için fileC
:
cat ~/file01 ~/file02 ~/file03 ~/fileA ~/fileB ~/fileC > merged-file
Veya, ayraç genişletme kullanarak:
cat ~/file0{1..3} ~/file{A..C} > merged-file
Veya meraklısı ayraç genişletme kullanarak:
cat ~/file{0{1..3},{A..C}} > merged-file
Veya for
döngü kullanabilirsiniz :
for i in file0{1..3} file{A..C}; do cat ~/"$i"; done > merged-file
[01-03]
İpin genel bir desen olarak çalışmayacağını unutmayın .
pattern
Bir dosyayı belirtebilir, ardından hepsini aşağıdaki şekilde birleştirebilirsiniz:
cat *pattern* >> mergedfile
Başka bir seçenek sed:
sed r 1.txt 2.txt 3.txt > merge.txt
Veya...
sed h 1.txt 2.txt 3.txt > merge.txt
Veya...
sed -n p 1.txt 2.txt 3.txt > merge.txt # -n is mandatory here
Veya yönlendirmeden ...
sed wmerge.txt 1.txt 2.txt 3.txt
Son satırın ayrıca merge.txt yazdığını unutmayın (wmerge.txt değil!). Dosya adıyla karışıklığı önlemek için w "merge.txt", sessiz çıktı için -n komutunu kullanabilirsiniz.
Elbette, dosya listesini joker karakterlerle de kısaltabilirsiniz. Örneğin, yukarıdaki örneklerde olduğu gibi numaralandırılmış dosyalar olması durumunda, aralıkları ayraçla şu şekilde belirleyebilirsiniz:
sed -n w"merge.txt" {1..3}.txt
*
"doğal" düzende genişleyecek şekilde numaralandırılırsa . Eğer "file1.txt ... file9.txt ... file14.txt" 'e sahipseniz, file1? .Txt, file1.txt ve file2.txt arasında sıralanacağından işe yaramaz. Bunları "file01.txt ... file09.txt ... file14.txt" olarak yeniden adlandırmanız gerekir.echo *
Emin değilseniz söyleyin .