Concatene arquivos de texto com a linha de comando do Windows, descartando as linhas principais

127

Preciso concatenar alguns arquivos de texto relativamente grandes e preferiria fazê-lo através da linha de comando. Infelizmente, tenho apenas o Windows e não consigo instalar um novo software.

type file1.txt file2.txt > out.txt

permite que eu quase consiga o que quero, mas não quero que a primeira linha do arquivo2.txt seja incluída no out.txt.

Percebi que moretem a +nopção de especificar uma linha de partida, mas não consegui combiná-las para obter o resultado desejado. Estou ciente de que isso pode não ser possível no Windows e sempre posso editar out.txt manualmente para se livrar da linha, mas existe uma maneira simples de fazer isso na linha de comando?

James
fonte

Respostas:

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

ou você pode usar copy. Veja copy /?para mais.

copy /b temp+file1.txt  out.txt
ghostdog74
fonte
4
Claro! Eu preferiria ter evitado o uso de arquivos temporários. Tentei usar parênteses, tubos e <para colocá-lo em um comando, mas não consegui chegar a lugar algum. O copycomando é muito mais rápido, mas coloca um caractere SUB no final. Há alguma maneira de evitar isto?
James
18
Eu acrescentaria que se você quiser concatenar TODOS os arquivos, poderá fazê-lo copy /b *.txt combined.txtsem precisar listar os arquivos individualmente.
Phlucious
1
mais aparentemente converter tab em espaços, pena!
Antonio
existe algum comando para recuperar arquivos originais de arquivos mesclados?
swapnil Gandhi
3
@ ghostdog74: Eu acho que deve ser type file1.txt temp > out.txtrealmente anexar o segundo arquivo, sem um cabeçalho para o primeiro
Marius
61

Eu uso isso e funciona bem para mim:

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

Claro, antes de cada corrida, você precisa DELETE C:\Folder\ConcatenatedFile.csv

O único problema é que, se todos os arquivos tiverem cabeçalhos, ele será repetido em todos os arquivos.

Raj More
fonte
2
Quando insiro um nome de arquivo para o arquivo concatenado, o que significa que ele está listado no final dos arquivos na loaction (ordem alfabética), o Windows parece concatenar duas vezes! Acabei usando um nome de arquivo 1filename.csv para não ter o problema. Eu acho que concatting em uma pasta diferente deve funcionar também ...
SebK
1
Se você usar> em vez de >>, não precisará excluir o arquivo antes. > redireciona a saída e cria o arquivo sempre novo. >> redireciona a saída e acrescenta.
Eddie Deyo
1
Como isso pula a primeira linha do arquivo2, sobre a qual o OP perguntou?
Dan Dascalescu
1
Não pula a primeira linha no arquivo2. Eu perdi essa parte da pergunta.
Raj More
1
existe algum comando para recuperar arquivos originais de arquivos mesclados?
swapnil Gandhi
21

Não tenho pontos de reputação suficientes para comentar a recomendação de usar *.csv >> ConcatenatedFile.csv , mas posso adicionar um aviso:

Se você criar um ConcatenatedFile.csvarquivo no mesmo diretório que está usando para concatenação, ele será adicionado a si mesmo.

John Faughnan
fonte
2
Como isso pula a primeira linha do arquivo2, sobre a qual o OP perguntou?
Dan Dascalescu
6

Use o comando FOR para repetir um arquivo linha por linha e, com a opção 'pular', para perder várias linhas de partida ...

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

Você pode redirecionar a saída de um arquivo em lotes, contendo algo como ...

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

Observe o dobro de% quando uma variável FOR é usada em um arquivo em lotes.

Alberto Rossini
fonte
4

Veja como fazer isso:

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

Eu colocaria isso em um comentário para ghostdog74, exceto que meu representante é muito baixo, então aqui vai.

more +2 file2.txt > temp
Esse código realmente ignorará as linhas 1 e 2 do arquivo. O OP deseja manter todas as linhas do primeiro arquivo (para manter a linha do cabeçalho) e depois excluir a primeira linha (presumivelmente a mesma linha de cabeçalho) no segundo arquivo, para excluir apenas a linha de cabeçalho que o OP deve usar more +1.

type temp file1.txt > out.txt

Não está claro qual ordem resulta desse código. É tempanexado a file1.txt(como desejado) ou file1.txtanexado a temp(indesejável, pois a linha do cabeçalho seria enterrada no meio do arquivo resultante).

Além disso, essas operações levam muito tempo com arquivos grandes (por exemplo, 300 MB)

Brian D
fonte
2

Sei que você disse que não podia instalar nenhum software, mas não tenho certeza de quão rígida é essa restrição. Enfim, tive o mesmo problema (tentando concatenar dois arquivos com presumivelmente os mesmos cabeçalhos) e pensei em fornecer uma resposta alternativa para outras pessoas que chegarem a esta página, pois funcionou muito bem para mim.

Depois de tentar um monte de comandos no Windows e ficar seriamente frustrado, e também tentar todos os tipos de editores gráficos que prometiam abrir arquivos grandes, mas que não conseguiam, finalmente voltei às minhas raízes no Linux e abri o Cygwin pronto. Dois comandos:

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

Para file1.csv800 file2.csvMB e 400 MB, esses dois comandos levaram menos de 5 segundos na minha máquina. Em um prompt do Cygwin, nada menos. Eu pensei que os comandos do Linux deviam ser lentos no Cygwin, mas essa abordagem exigia muito menos esforço e era muito mais fácil do que qualquer abordagem do Windows que eu pudesse encontrar.

Andrew Mao
fonte
1

No PowerShell:

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

Você também pode simplesmente tentar isso

type file2.txt >> file1.txt

Anexará o conteúdo do arquivo2.txt no final do arquivo1.txt

Se você precisar de file1.txt original, faça um backup com antecedência. Ou você pode fazer isso

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

Se você deseja interromper uma linha no final do primeiro arquivo, tente o seguinte comando antes de anexar.

type file1.txt > out.txt
printf "\n" >> out.txt
type file2.txt >> out.txt
Hamed
fonte
0

A ajuda para copyexplica que curingas podem ser usados ​​para concatenar vários arquivos em um.

Por exemplo, para copiar todos os arquivos .txt na pasta atual que começam com "abc" em um único arquivo chamado xyz.txt:

copy abc*.txt xyz.txt
GaTechThomas
fonte
-1
more +2 file1.txt > type > out.txt && type file2.txt > out.txt
Wujin
fonte
-1

Isso leva Test.txtcom cabeçalhos, anexa Test1.txte Test2.txtgrava os resultados no Testresult.txtarquivo depois de remover os cabeçalhos do segundo e terceiro arquivos, respectivamente:

type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt
user10301222
fonte