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_sortopsiyonunu 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-fileiyi çalışıyor. Globs, dosya oluşturulmadan önce işlenir. Eğer merged-filezaten 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.
catDosyanın çıktı olup olmadığını tespit etmenin bir yolu yoktur. Yönlendirme kabukta olur; catsadece 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 file01için file03ve fileAiç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 fordö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 .
patternBir 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 .