Ответ 1
more +2 file2.txt > temp
type temp file1.txt > out.txt
или вы можете использовать copy
. Подробнее см. copy /?
.
copy /b temp+file1.txt out.txt
Мне нужно объединить некоторые относительно большие текстовые файлы и предпочтет сделать это через командную строку. К сожалению, у меня только Windows, и я не могу установить новое программное обеспечение.
type file1.txt file2.txt > out.txt
позволяет мне почти получить то, что я хочу, но я не хочу, чтобы первая строка файла file2.txt была включена в out.txt.
Я заметил, что more
имеет параметр +n
для указания стартовой строки, но мне не удалось объединить их, чтобы получить результат, который я хочу. Я знаю, что это может быть невозможно в Windows, и я всегда могу отредактировать out.txt вручную, чтобы избавиться от строки, но есть ли простой способ сделать это из командной строки?
more +2 file2.txt > temp
type temp file1.txt > out.txt
или вы можете использовать copy
. Подробнее см. copy /?
.
copy /b temp+file1.txt out.txt
Я использую это, и он хорошо работает для меня:
TYPE \\Server\Share\Folder\*.csv >> C:\Folder\ConcatenatedFile.csv
Конечно, перед каждым прогоном вы должны DELETE C:\Folder\ConcatenatedFile.csv
Единственная проблема заключается в том, что если все файлы имеют заголовки, то они будут повторяться во всех файлах.
У меня недостаточно очков репутации, чтобы прокомментировать рекомендацию использовать *.csv >> ConcatenatedFile.csv
, но я могу добавить предупреждение:
Если вы создаете файл ConcatenatedFile.csv
в том же каталоге, который вы используете для конкатенации, он будет добавлен к себе.
Используйте команду 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
Обратите внимание на double%, когда переменная FOR используется в пакетном файле.
Я бы поставил это в комментарий к 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 МБ)
Я знаю, что вы сказали, что не можете установить какое-либо программное обеспечение, но я не уверен, насколько это ограничение. Во всяком случае, у меня была такая же проблема (попытка объединить два файла с предположительно одинаковыми заголовками), и я подумал, что я дам альтернативный ответ другим, которые приходят на эту страницу, так как это сработало для меня отлично.
Попробовав целую кучу команд в 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, но этот подход требует гораздо меньше усилий и был намного проще, чем любой подход к окнам, который я мог найти.
Вот как это сделать:
(type file1.txt && more +1 file2.txt) > out.txt
В PowerShell:
Get-Content file1.txt | Out-File out.txt
Get-Content file2.txt | Select-Object -Skip 1 | Out-File -Append out.txt
Вы также можете просто попробовать это
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
В справке по copy
объясняется, что подстановочные знаки можно использовать для объединения нескольких файлов в один.
Например, чтобы скопировать все файлы .txt в текущей папке, начинающиеся с "abc", в один файл с именем xyz.txt:
copy abc*.txt xyz.txt
more +2 file1.txt > type > out.txt && type file2.txt > out.txt
Это берет 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