Menggabungkan file teks dengan baris perintah Windows, menjatuhkan baris terkemuka

127

Saya perlu menggabungkan beberapa file teks yang relatif besar, dan lebih suka melakukan ini melalui baris perintah. Sayangnya saya hanya memiliki Windows, dan tidak dapat menginstal perangkat lunak baru.

type file1.txt file2.txt > out.txt

memungkinkan saya hampir mendapatkan apa yang saya inginkan, tetapi saya tidak ingin baris pertama file2.txt dimasukkan dalam out.txt.

Saya perhatikan bahwa morememiliki +nopsi untuk menentukan garis awal, tetapi saya belum berhasil menggabungkannya untuk mendapatkan hasil yang saya inginkan. Saya sadar bahwa ini tidak mungkin di Windows, dan saya selalu dapat mengedit out.txt dengan tangan untuk menghilangkan baris, tetapi apakah ada cara sederhana untuk melakukannya dari baris perintah?

James
sumber

Jawaban:

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

atau bisa kamu gunakan copy. Lihat copy /?lebih lanjut.

copy /b temp+file1.txt  out.txt
ghostdog74
sumber
4
Tentu saja! Saya lebih suka menghindari penggunaan file sementara. Saya mencoba menggunakan tanda kurung, pipa dan <untuk membuatnya menjadi satu perintah, tetapi tidak bisa kemana-mana. The copyperintah jauh lebih cepat, tetapi menempatkan karakter SUB di akhir. Apakah ada cara untuk menghindari ini?
James
18
Saya akan menambahkan bahwa jika Anda ingin menggabungkan SEMUA file yang dapat Anda lakukan copy /b *.txt combined.txttanpa harus membuat daftar file secara individual.
Phlucious
1
lebih konversikan tab menjadi spasi, sayang!
Antonio
apakah ada perintah untuk mengambil file asli dari file yang digabungkan?
swapnil gandhi
3
@ ghostdog74: Saya pikir itu harus type file1.txt temp > out.txtbenar-benar menambahkan file kedua, tanpa header ke yang pertama
Marius
61

Saya menggunakan ini, dan itu berfungsi dengan baik untuk saya:

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

Tentu saja, sebelum menjalankan, Anda harus melakukannya DELETE C:\Folder\ConcatenatedFile.csv

Satu-satunya masalah adalah jika semua file memiliki header, maka itu akan diulang di semua file.

Raj More
sumber
2
Ketika saya memasukkan nama file untuk file bersambung, yang berarti itu terdaftar di akhir file dalam loaction (urutan abjad), maka windows tampaknya digabungkan dua kali! Saya akhirnya menggunakan nama file 1filename.csv untuk tidak memiliki masalah. Saya kira masuk ke folder yang berbeda harus bekerja juga ...
SebK
1
Jika Anda menggunakan> alih-alih >>, Anda tidak perlu menghapus file sebelumnya. > redirect output dan membuat file baru setiap saat. >> mengalihkan output dan menambahkan.
Eddie Deyo
1
Bagaimana ini melewati baris pertama di file2, yang ditanyakan OP?
Dan Dascalescu
1
Itu tidak melewati baris pertama di file2. Saya melewatkan bagian pertanyaan itu.
Raj More
1
apakah ada perintah untuk mengambil file asli dari file yang digabungkan?
swapnil gandhi
21

Saya tidak memiliki poin reputasi yang cukup untuk mengomentari rekomendasi yang akan digunakan *.csv >> ConcatenatedFile.csv, tetapi saya dapat menambahkan peringatan:

Jika Anda membuat ConcatenatedFile.csvfile di direktori yang sama dengan yang Anda gunakan untuk penggabungan, itu akan ditambahkan ke dirinya sendiri.

John Faughnan
sumber
2
Bagaimana ini melewati baris pertama di file2, yang ditanyakan OP?
Dan Dascalescu
6

Gunakan perintah FOR untuk menggemakan file baris demi baris, dan dengan opsi 'lewati' untuk melewatkan sejumlah baris awal ...

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

Anda bisa mengarahkan output file batch, berisi sesuatu seperti ...

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

Catat% ganda ketika variabel UNTUK digunakan dalam file batch.

Alberto Rossini
sumber
4

Berikut cara melakukannya:

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

Saya akan menempatkan ini dalam komentar ke ghostdog74, kecuali perwakilan saya terlalu rendah, jadi begini.

more +2 file2.txt > temp
Kode ini sebenarnya akan mengabaikan baris 1 dan 2 file. OP ingin menyimpan semua baris dari file pertama (untuk mempertahankan baris tajuk), lalu mengecualikan baris pertama (mungkin baris tajuk yang sama) pada file kedua, jadi untuk mengecualikan hanya baris tajuk yang harus digunakan OP more +1.

type temp file1.txt > out.txt

Tidak jelas hasil pesanan apa dari kode ini. Apakah tempditambahkan ke file1.txt(seperti yang diinginkan), atau file1.txtditambahkan ke temp(tidak diinginkan karena baris header akan dimakamkan di tengah file yang dihasilkan).

Selain itu, operasi ini membutuhkan waktu yang SANGAT PANJANG dengan file besar (mis. 300MB)

Brian D
sumber
2

Saya tahu Anda mengatakan bahwa Anda tidak dapat menginstal perangkat lunak apa pun, tetapi saya tidak yakin seberapa ketat pembatasan itu. Lagi pula, saya memiliki masalah yang sama (mencoba menyatukan dua file dengan header yang mungkin sama) dan saya pikir saya akan memberikan jawaban alternatif untuk orang lain yang tiba di halaman ini, karena itu bekerja hanya bagus untuk saya.

Setelah mencoba sejumlah besar perintah di windows dan menjadi sangat frustrasi, dan juga mencoba semua jenis editor grafis yang berjanji untuk dapat membuka file besar, tetapi kemudian tidak bisa, saya akhirnya kembali ke root Linux saya dan membuka Cygwin saya cepat. Dua perintah:

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

Untuk file1.csv800MB dan file2.csv400MB, kedua perintah itu membutuhkan waktu kurang dari 5 detik di mesin saya. Dalam prompt Cygwin, tidak kurang. Saya pikir perintah-perintah Linux seharusnya lambat di Cygwin tetapi pendekatan itu membutuhkan lebih sedikit usaha dan jauh lebih mudah daripada pendekatan windows yang bisa saya temukan.

Andrew Mao
sumber
1

Dalam PowerShell:

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

Anda juga bisa mencoba ini

type file2.txt >> file1.txt

Ini akan menambahkan konten file2.txt di akhir file1.txt

Jika Anda memerlukan file1.txt asli, buat cadangan terlebih dahulu. Atau Anda bisa melakukan ini

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

Jika Anda ingin memiliki jeda baris di akhir file pertama, Anda dapat mencoba perintah berikut sebelum menambahkan.

type file1.txt > out.txt
printf "\n" >> out.txt
type file2.txt >> out.txt
Hamed
sumber
0

Bantuan untuk copymenjelaskan bahwa wildcard dapat digunakan untuk menggabungkan beberapa file menjadi satu.

Misalnya, untuk menyalin semua file .txt di folder saat ini yang dimulai dengan "abc" ke dalam satu file bernama xyz.txt:

copy abc*.txt xyz.txt
GaTechThomas
sumber
-1
more +2 file1.txt > type > out.txt && type file2.txt > out.txt
Wujin
sumber
-1

Ini mengambil Test.txtdengan header dan menambahkan Test1.txtdan Test2.txtdan menulis hasil ke Testresult.txtfile setelah menghapus header dari file kedua dan ketiga masing-masing:

type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt
pengguna10301222
sumber