Объедините текстовые файлы с командной строкой Windows, отбрасывая ведущие строки


127

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

type file1.txt file2.txt > out.txt

позволяет мне почти получить то, что я хочу, но я не хочу, чтобы первая строка файла 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без необходимости перечислять файлы по отдельности.
Phlucious 01

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
Когда я ввожу имя файла для объединенного файла, что означает, что он указан в конце файлов в локальном действии (в алфавитном порядке), окна, кажется, объединяются дважды! В итоге я использовал имя файла 1filename.csv, чтобы не было проблемы. Думаю, объединение в другую папку также должно работать ...
SebK

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

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

1
Он не пропускает первую строку в file2. Я пропустил эту часть вопроса.
Raj More

1
есть ли какая-нибудь команда для извлечения исходных файлов из объединенных файлов?
swapnil gandhi

21

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

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


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

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


4

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

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

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 МБ и 400 file2.csvМБ эти две команды на моей машине заняли менее 5 секунд. Не меньше, чем в подсказке Cygwin. Я думал, что команды Linux должны быть медленными в Cygwin, но этот подход требовал гораздо меньше усилий и был намного проще, чем любой подход Windows, который я мог найти.


1

В PowerShell:

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.