Dosyaları Birleştirme ve Dosyaların Arasına Yeni Satır Ekleme


127

Birleştirmek istediğim birden fazla dosyam var cat. Diyelimki

File1.txt 
foo

File2.txt
bar

File3.txt
qux

Son dosyanın şöyle görünmesi için birleştirmek istiyorum:

foo

bar

qux

Bunun yerine her zamanki gibi cat File*.txt > finalfile.txt

foo
bar 
qux

Bunu yapmanın doğru yolu nedir?


Yanıtlar:


121

Yapabilirsin:

for f in *.txt; do (cat "${f}"; echo) >> finalfile.txt; done

finalfile.txtYukarıdaki komutu çalıştırmadan önce dosyanın var olmadığından emin olun .

Kullanmanıza izin veriliyorsa awkşunları yapabilirsiniz:

awk 'FNR==1{print ""}1' *.txt > finalfile.txt

10
AWK '{print $0}' *.txt
zamanlayıcı

7
Bu, ya sonunda (ilk alternatiften) ya da başlangıçta (ikinci alternatif) boş satırların olması gibi belirgin bir kusura sahiptir. awk 'FNR==1 && NR > 1 ...'Bununla birlikte , buna karşı kolayca korunabilirsiniz .
üçlü

5
Ekleme yerine üzerine yazabilirsin >finalfile.txtsonrasına koyarsanız done, döngüden önce dosyanın eksik veya boş olduğundan emin olma gereksinimi ortadan kalkar.
üçlü

53

Her birini listeleyebileceğiniz kadar az dosyanız varsa, o zaman her dosya çiftinin arasına yeni bir satır ekleyerek Bash'de işlem değiştirmeyi kullanabilirsiniz :

cat File1.txt <(echo) File2.txt <(echo) File3.txt > finalfile.txt

1
Güzel! Teşekkürler.
Bob Kocisko

Bu, Letsencrypt sertifikalarımın .pem dosyalarını oluşturması için iyi çalıştı.
leeman24

35

Ben yapsaydım sed kullanırdım:

sed -e '$s/$/\n/' -s *.txt > finalfile.txt

Bu sed modelinde $ iki anlama sahiptir, birincisi yalnızca son satır numarasıyla eşleşir (bir desen uygulanacak bir satır aralığı olarak) ve ikinci olarak ikame desenindeki satırın sonuyla eşleşir.

Sed sürümünüzde yoksa -s(giriş dosyalarını ayrı olarak işleyin), hepsini bir döngü olarak yapabilirsiniz:

for f in *.txt ; do sed -e '$s/$/\n/' $f ; done > finalfile.txt

3
Veya GNU sed -s '$G' *.txt > finalfile.txt
sed'de

Sadece bir akış! bu kabul edilen cevap olmalı!
Yassine ElBadaoui

Ben kullanıldığından dikkatli adamlar olmak, ben sadece benim PC çöktü findyerine *.txtdosyayı demekti kendi üzerine eklenen edildi!
Xerus

11

İsterseniz kullanarak da yapabilirsiniz xargs, ancak ana fikir hala aynı:

find *.txt | xargs -I{} sh -c "cat {}; echo ''" > finalfile.txt

1
Teşekkürler. xargsBash'deki döngüleri kullanmaktan çok daha kolay buluyorum .
RawwrBag

9

Bu Bash'de çalışır:

for f in *.txt; do cat $f; echo; done

>>(Ekleme) ile verilen yanıtların aksine , bu komutun çıktısı diğer programlara aktarılabilir.

Örnekler:

  • for f in File*.txt; do cat $f; echo; done > finalfile.txt
  • (for ... done) > finalfile.txt (parens isteğe bağlıdır)
  • for ... done | less (daha azına doğru)
  • for ... done | head -n -1 (bu, sondaki boş satırı çıkarır)

7

OsX 10.10.3'te böyle yaptım

for f in *.txt; do (cat $f; echo '') >> fullData.txt; done

çünkü hiçbir parametre içermeyen basit 'echo' komutu yeni satırların eklenmemesiyle sonuçlandı.


Bu, dizeyi dosyanın sonuna koyar; her dosya arasına nasıl ekleyebilirim ?
onassar

3

Python'da, bu, dosyalar arasında boş satırlarla birleştirilir ( ,sonda fazladan bir boş satır eklemeyi bastırır):

print '\n'.join(open(f).read() for f in filenames),

İşte kabuktan çağrılabilen ve çıktıyı bir dosyaya yazdıran çirkin python tek satırlık:

python -c "from sys import argv; print '\n'.join(open(f).read() for f in argv[1:])," File*.txt > finalfile.txt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.