Metin dosyalarını Windows komut satırıyla birleştirin, önde gelen satırları bırakın


127

Bazı nispeten büyük metin dosyalarını birleştirmem gerekiyor ve bunu komut satırı aracılığıyla yapmayı tercih ederim. Ne yazık ki sadece Windows'um var ve yeni yazılım yükleyemiyorum.

type file1.txt file2.txt > out.txt

neredeyse istediğimi elde etmeme izin veriyor, ancak file2.txt'nin 1. satırının out.txt'ye dahil edilmesini istemiyorum.

Fark ettim moresahiptir +nbir başlangıç çizgisini belirtmek için seçenek, ama istediğim sonucu elde etmek için bu birleştirmek için yönetilen değil. Bunun Windows'ta mümkün olmayabileceğinin farkındayım ve out.txt dosyasını her zaman elle düzenleyerek satırdan kurtulabilirim, ancak bunu komut satırından yapmanın basit bir yolu var mı?

Yanıtlar:


136
more +2 file2.txt > temp
type temp file1.txt > out.txt

ya da kullanabilirsiniz copy. Daha fazlası copy /?için bakın .

copy /b temp+file1.txt  out.txt

4
Elbette! Yine de geçici dosyaların kullanımından kaçınmayı tercih ederdim. Parantez, boru ve <kullanarak tek bir komuta girmeye çalıştım, ancak hiçbir yere ulaşamadım. copyKomut çok daha hızlıdır, ancak sonunda bir ALT karakterini koyar. Bundan sakınmanın bir yolu var mı?
James

18
TÜM dosyaları birleştirmek istiyorsanız copy /b *.txt combined.txt, dosyaları tek tek listelemek zorunda kalmadan yapabileceğinizi ekleyeceğim .
Phlucious

1
daha çok sekmeyi boşluklara dönüştürmek, yazık!
Antonio

orijinal dosyaları birleştirilmiş dosyalardan almak için herhangi bir komut var mı?
swapnil gandhi

3
@ ghostdog74: Sanırım type file1.txt temp > out.txtikinci dosyayı ilk dosyaya başlık olmadan eklemek gerekiyor
Marius

61

Bunu kullanıyorum ve benim için iyi çalışıyor:

TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv

Tabii ki, her koşudan önce yapmanız gereken DELETE C:\Folder\ConcatenatedFile.csv

Tek sorun, tüm dosyaların başlıkları varsa, tüm dosyalarda tekrarlanacak olmasıdır.


2
Birleştirilmiş dosya için bir dosya adı girdiğimde, bu, dosya işlemindeki dosyaların sonunda (alfabetik sırayla) listelendiği anlamına gelir, o zaman pencereler iki kez birleşiyor gibi görünüyor! Sorunu yaşamamak için 1filename.csv dosya adını kullandım. Sanırım farklı bir klasöre yerleştirmek de işe
yaramalı

1
>> yerine> kullanırsanız, dosyayı önceden silmeniz gerekmez. > çıktıyı yeniden yönlendirir ve her seferinde yeni bir dosya oluşturur. >> çıktıyı ve ekleri yeniden yönlendirir.
Eddie Deyo

1
Bu, OP'nin sorduğu dosya2'deki ilk satırı nasıl atlar?
Dan Dascalescu

1
Dosya2'deki ilk satırı atlamaz. Sorunun o kısmını kaçırdım.
Raj More

1
orijinal dosyaları birleştirilmiş dosyalardan almak için herhangi bir komut var mı?
swapnil gandhi

21

Kullanım tavsiyesi hakkında yorum yapmak için yeterli itibar puanım yok *.csv >> ConcatenatedFile.csv, ancak bir uyarı ekleyebilirim:

ConcatenatedFile.csvBirleştirme için kullandığınız aynı dizinde dosya oluşturursanız, dosya kendisine eklenir.


2
Bu, OP'nin sorduğu dosya2'deki ilk satırı nasıl atlar?
Dan Dascalescu

6

Bir dosyayı satır satır yinelemek için FOR komutunu kullanın ve bir dizi başlangıç ​​satırını kaçırmak için 'atla' seçeneğiyle ...

FOR /F "skip=1" %i in (file2.txt) do @echo %i

Şunun gibi bir şey içeren bir toplu iş dosyasının çıktısını yeniden yönlendirebilirsiniz ...

FOR /F %%i in (file1.txt) do @echo %%i
FOR /F "skip=1" %%i in (file2.txt) do @echo %%i

Bir toplu iş dosyasında bir FOR değişkeni kullanıldığında% çiftine dikkat edin.


4

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

(type file1.txt && more +1 file2.txt) > out.txt

3

Bunu ghostdog74'e bir yoruma koyardım, tek farkım çok düşük, işte burada.

more +2 file2.txt > temp
Bu kod aslında dosyanın 1. ve 2. satırlarını yok sayacaktır. OP, ilk dosyadaki tüm satırları saklamak (başlık satırını korumak için) ve ardından ikinci dosyadaki ilk satırı (muhtemelen aynı başlık satırı) hariç tutmak, böylece yalnızca OP'nin kullanması gereken başlık satırını hariç tutmak istiyor more +1.

type temp file1.txt > out.txt

Bu koddan hangi sıranın çıktığı belirsizdir. Mi temptutunmuş file1.txt(seçenek olarak), ya da file1.txtekli temp(başlık satırı elde edilen dosyanın ortasında gömülecek gibi istenmeyen).

Ek olarak, bu işlemler büyük dosyalarla (örneğin 300MB) GERÇEKTEN UZUN SÜRE alır


2

Herhangi bir yazılım yükleyemeyeceğinizi söylediğinizi biliyorum, ancak bu kısıtlamanın ne kadar sıkı olduğundan emin değilim. Her neyse, aynı sorunu yaşadım (iki dosyayı muhtemelen aynı başlıklarla birleştirmeye çalışıyorum) ve bu sayfaya gelen diğerlerine alternatif bir yanıt vereceğimi düşündüm, çünkü bu benim için çok iyi çalıştı.

Pencerelerde bir sürü komut denedikten ve ciddi şekilde hüsrana uğradıktan ve ayrıca büyük dosyaları açmayı vaat eden, ancak sonra yapamayan her türlü grafik düzenleyiciyi denedikten sonra, sonunda Linux köklerime geri döndüm ve Cygwin'imi açtım. Komut istemi. İki komut:

cp file1.csv out.csv
tail -n+2 file2.csv >> out.csv

İçin file1.csv800MB ve file2.csv400MB, bu iki komut benim makinede 5 saniyenin altında aldı. Bir Cygwin isteminde, daha azı değil. Linux komutlarının Cygwin'de yavaş olması gerektiğini sanıyordum, ancak bu yaklaşım çok daha az çaba gerektiriyordu ve bulabildiğim herhangi bir Windows yaklaşımından çok daha kolaydı.


1

Powershell'de:

Get-Content file1.txt | Out-File out.txt
Get-Content file2.txt | Select-Object -Skip 1 | Out-File -Append out.txt

0

Bunu da deneyebilirsiniz

type file2.txt >> file1.txt

Dosya2.txt'nin içeriğini dosya1.txt'nin sonuna ekleyecektir.

Orijinal dosya1.txt dosyasına ihtiyacınız varsa, önceden bir yedek alın. Veya bunu yapabilirsin

type file1.txt > out.txt
type file2.txt >> out.txt

İlk dosyanın sonunda bir satır sonu olmasını istiyorsanız, eklemeden önce aşağıdaki komutu deneyebilirsiniz.

type file1.txt > out.txt
printf "\n" >> out.txt
type file2.txt >> out.txt

0

İçin yardım copy , joker karakterlerin birden çok dosyayı tek bir dosyada birleştirmek için kullanılabileceğini açıklar.

Örneğin, geçerli klasörde "abc" ile başlayan tüm .txt dosyalarını xyz.txt adlı tek bir dosyaya kopyalamak için:

copy abc*.txt xyz.txt

-1
more +2 file1.txt > type > out.txt && type file2.txt > out.txt

-1

Bu, Test.txtüstbilgileri alır ve ekler Test1.txtve sırasıyla ikinci ve üçüncü dosyalardan üstbilgiler çıkarıldıktan sonra Test2.txtsonuçları Testresult.txtdosyaya yazar :

type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.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.