Об’єднайте текстові файли за допомогою командного рядка Windows, випадаючи провідні рядки


127

Мені потрібно об'єднати деякі відносно великі текстові файли, і я вважаю за краще це робити за допомогою командного рядка. На жаль, у мене є тільки Windows, і я не можу встановити нове програмне забезпечення.

type file1.txt file2.txt > out.txt

дозволяє мені майже отримати те, що я хочу, але я не хочу, щоб 1-й рядок file2.txt включався в out.txt.

Я помітив, що moreє +nможливість вказати стартову лінію, але мені не вдалося їх поєднати, щоб отримати бажаний результат. Я знаю, що це не можливо в Windows, і я завжди можу вручну редагувати out.txt, щоб позбутися від рядка, але чи є простий спосіб зробити це з командного рядка?

Відповіді:


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

або ви можете використовувати copy. Дивіться copy /?докладніше.

copy /b temp+file1.txt  out.txt

4
Звичайно! Я б вважав за краще уникати використання тимчасових файлів. Я намагався використовувати круглі дужки, дупки та <, щоб ввести його в одну команду, але нікуди не міг потрапити. copyКоманда набагато швидше, але він ставить SUB символ в кінці. Чи є спосіб цього уникнути?
Джеймс

18
Я хотів би додати, що якщо ви хочете об'єднати ВСІ файли, ви можете це зробити, copy /b *.txt combined.txtне перераховуючи файли окремо.
Поважний

1
більше, здавалося б, перетворити вкладку в пробіли, шкода
Антоніо

чи є якась команда для отримання оригінальних файлів із об'єднаних файлів?
swapnil gandhi

3
@ ghostdog74: Я думаю, що type file1.txt temp > out.txtнасправді слід додати другий файл без заголовка до першого
Маріус

61

Я використовую це, і це добре працює для мене:

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

Звичайно, перед кожним пробігом потрібно DELETE C:\Folder\ConcatenatedFile.csv

Єдине питання полягає в тому, що якщо всі файли мають заголовки, то це буде повторено у всіх файлах.


2
Коли я ввожу ім'я для об'єднаного файлу, а це означає, що воно перелічене в кінці файлів у локації (в алфавітному порядку), то Windows, здається, об'єднується двічі! Я в кінцевому рахунку використовував ім'я файлу 1filename.csv, щоб не виникнути проблем. Я думаю, що концентрування в іншій папці має працювати також ...
SebK

1
Якщо ви використовуєте> замість >>, вам не доведеться попередньо видаляти файл. > переадресовує вихід і створює файл новий раз. >> перенаправляє вихід і додає.
Едді Дейо

1
Як це пропускає перший рядок у file2, про який запитував ОП?
Дан Даскалеску

1
Він не пропускає перший рядок у file2. Я пропустив цю частину питання.
Raj More

1
чи є якась команда для отримання оригінальних файлів із об'єднаних файлів?
swapnil gandhi

21

У мене недостатньо точок репутації, щоб коментувати рекомендацію щодо використання *.csv >> ConcatenatedFile.csv, але можу додати попередження:

Якщо ви створюєте ConcatenatedFile.csvфайл у тому самому каталозі, який ви використовуєте для конкатенації, він буде доданий до себе.


2
Як це пропускає перший рядок у file2, про який запитував ОП?
Дан Даскалеску

6

Використовуйте команду FOR, щоб повторювати файл за рядком, а за допомогою параметра "пропустити" пропустіть ряд початкових рядків ...

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

Ви можете перенаправити вихідний пакетний файл, що містить щось на зразок ...

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

Зверніть увагу на подвійний%, коли змінна FOR використовується в пакетному файлі.



3

Я б поставив це в коментарі до ghostdog74, за винятком того, що моя реп є занадто низькою, тому тут ідеться.

more +2 file2.txt > temp
Цей код фактично ігнорує рядки 1 та 2 файлу. OP хоче зберегти всі рядки з першого файлу (для підтримки рядка заголовка), а потім виключити перший рядок (імовірно, той самий рядок заголовка) з другого файлу, тому для виключення слід використовувати лише рядок заголовка OP more +1.

type temp file1.txt > out.txt

Незрозуміло, який порядок є результатом цього коду. Є tempдодаються до file1.txt(за бажанням), або file1.txtдодаються до temp(небажано як рядок заголовка буде похована в середині результуючого файлу).

Крім того, ці операції займають ДІЙСНО ДЛЯ ЧАСУ з великими файлами (наприклад, 300 Мб)


2

Я знаю, ви сказали, що не можете встановити жодне програмне забезпечення, але я не впевнений, наскільки жорстке це обмеження. У всякому разі, у мене був той самий випуск (намагався з'єднати два файли з імовірно однаковими заголовками), і я подумав, що я дам альтернативну відповідь для інших, хто прийшов на цю сторінку, оскільки це працювало для мене просто чудово.

Спробувавши цілу купу команд у Windows та сильно засмутившись, а також спробувавши всілякі графічні редактори, які обіцяли відкрити великі файли, але потім не змогли, я нарешті повернувся до свого коріння Linux та відкрив Cygwin підказка. Дві команди:

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

Для file1.csv800 Мб і file2.csv400 МБ ці дві команди зайняли менше 5 секунд на моїй машині. У запиті Cygwin, не менше. Я думав, що команди Linux повинні бути повільними в Cygwin, але такий підхід зайняв набагато менше зусиль і був набагато простішим, ніж будь-який підхід до Windows, який я міг знайти.


1

У повноваженнях:

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

0

Ви також можете просто спробувати це

type file2.txt >> file1.txt

Він додасть вміст file2.txt в кінці file1.txt

Якщо вам потрібен оригінальний file1.txt, попередньо візьміть резервну копію. Або ти можеш це зробити

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

Якщо ви хочете мати перерву рядка в кінці першого файлу, ви можете спробувати наступну команду перед додаванням.

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

0

Допомога для copy пояснюється, що макіяж може бути використаний для об'єднання декількох файлів в один.

Наприклад, скопіювати всі .txt файли в поточну папку, які починаються з "abc", в один файл з назвою xyz.txt:

copy abc*.txt xyz.txt


-1

Це займає Test.txtзаголовки та додає, Test1.txtа Test2.txtтакож записує результати у Testresult.txtфайл після зняття заголовків з другого та третього файлів відповідно:

type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.