Объединять текстовые файлы с помощью командной строки Windows, удаляя ведущие строки - PullRequest
123 голосов
/ 19 марта 2010

Мне нужно объединить некоторые относительно большие текстовые файлы, и я бы предпочел сделать это через командную строку.К сожалению, у меня есть только Windows, и я не могу установить новое программное обеспечение.

type file1.txt file2.txt > out.txt

позволяет мне почти получить то, что я хочу, но я не хочу, чтобы 1-я строка file2.txt была включена в out.txt.

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

Ответы [ 11 ]

134 голосов
/ 19 марта 2010
more +2 file2.txt > temp
type temp file1.txt > out.txt

или вы можете использовать copy. Подробнее см. copy /?.

copy /b temp+file1.txt  out.txt
61 голосов
/ 29 ноября 2012

Я использую это, и оно хорошо работает для меня:

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

Конечно, перед каждым запуском необходимо DELETE C:\Folder\ConcatenatedFile.csv

Единственноепроблема в том, что если все файлы имеют заголовки, то это будет повторяться во всех файлах.

21 голосов
/ 26 ноября 2013

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

Если вы создадите файл ConcatenatedFile.csv в том же каталоге, который вы используете для объединения, он будет добавлен к себе.

6 голосов
/ 19 марта 2010

Используйте команду FOR, чтобы построчно отображать файл, а с опцией 'skip' пропустить несколько начальных строк ...

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 голосов
/ 20 декабря 2013

Я бы поставил это в комментарии к 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 голосов
/ 14 сентября 2017

Вот как это сделать:

(type file1.txt && more +1 file2.txt) > out.txt
2 голосов
/ 03 октября 2012

Я знаю, что вы сказали, что не можете установить какое-либо программное обеспечение, но я не уверен, насколько жестким является это ограничение. В любом случае, у меня возникла та же проблема (попытка объединить два файла с предположительно одинаковыми заголовками), и я подумал, что предоставлю альтернативный ответ для других, которые приходят на эту страницу, так как она отлично работает для меня.

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

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

Для file1.csv 800 МБ и file2.csv 400 МБ эти две команды на моей машине заняли менее 5 секунд. В приглашении Cygwin не меньше. Я думал, что команды Linux должны были быть медленными в Cygwin, но этот подход потребовал гораздо меньше усилий и был намного проще, чем любой другой подход, который я мог найти.

1 голос
/ 07 июня 2018

В PowerShell:

Get-Content file1.txt | Out-File out.txt
Get-Content file2.txt | Select-Object -Skip 1 | Out-File -Append out.txt
0 голосов
/ 12 декабря 2018

Вы также можете просто попробовать это

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 голосов
/ 31 августа 2018

Это занимает 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...