2010-03-19 2 views
105

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

type file1.txt file2.txt > out.txt 

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

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

ответ

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

или вы можете использовать copy. См. copy /? для получения дополнительной информации.

copy /b temp+file1.txt out.txt 
+1

Конечно! Однако я предпочел бы избежать использования временных файлов. Я попытался использовать круглые скобки, трубы и <, чтобы получить его в одну команду, но нигде не смог. Команда 'copy' выполняется намного быстрее, но в конце она помещает символ SUB. Есть ли способ избежать этого? – James

+10

Да, вы положили '/ b'. см. edit – ghostdog74

+7

Я бы добавил, что если вы хотите объединить ВСЕ файлы, вы можете сделать 'copy/b * .txt mixed.txt' без необходимости перечислять файлы по отдельности. – Phlucious

6

Используйте для команды эхо файл построчно, и с «пропустить» возможность пропустить ряд исходных линий ...

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 используется в пакетном файле.

2

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

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

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

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

55

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

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

Конечно, перед каждым бежать, вы должны DELETE C:\Folder\ConcatenatedFile.csv

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

+1

Когда я ввожу имя файла для конкатенированного файла, что означает, что он указан в конце файлов в loaction (в алфавитном порядке), тогда окна, кажется, объединяются дважды! Я закончил использование имени файла 1filename.csv, чтобы не иметь проблемы. Я думаю, что вступление в другую папку должно также работать ... – SebK

+0

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

+0

Как это пропустить первую строку в файле2, о которой спрашивал ОП? –

20

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

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

+1

Как это пропустить первую строку в файле2, о которой спрашивал ОП? –

2

Я бы поместил это в комментарий к ghostdog74, за исключением того, что мой представитель слишком низок, поэтому здесь идет.

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

type temp file1.txt > out.txt

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

Кроме того, эти операции очень долгое время с большими файлами (например, 300MB)

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

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

(type file1.txt && more +1 file2.txt) > out.txt 
Смежные вопросы