Concatenar archivos de texto con la línea de comandos de Windows, soltando las líneas iniciales

127

Necesito concatenar algunos archivos de texto relativamente grandes, y preferiría hacerlo a través de la línea de comando. Lamentablemente, solo tengo Windows y no puedo instalar un nuevo software.

type file1.txt file2.txt > out.txt

me permite casi obtener lo que quiero, pero no quiero que la primera línea de file2.txt se incluya en out.txt.

He notado que moretiene la +nopción de especificar una línea de partida, pero no he logrado combinarlas para obtener el resultado que quiero. Soy consciente de que esto puede no ser posible en Windows, y siempre puedo editar out.txt a mano para deshacerme de la línea, pero ¿hay alguna manera simple de hacerlo desde la línea de comandos?

James
fuente

Respuestas:

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

o puedes usar copy. Mira copy /?para más.

copy /b temp+file1.txt  out.txt
ghostdog74
fuente
44
¡Por supuesto! Sin embargo, hubiera preferido evitar el uso de archivos temporales. Traté de usar paréntesis, tuberías y <para ponerlo en un solo comando, pero no pude llegar a ninguna parte. El copycomando es mucho más rápido, pero pone un carácter SUB al final. Hay alguna manera de evitar esto?
James
18
Agregaría que si desea concatenar TODOS los archivos, puede hacerlo copy /b *.txt combined.txtsin tener que enumerarlos individualmente.
Phlucious
1
más aparentemente convertir pestaña en espacios, lástima!
Antonio
¿Hay algún comando para recuperar archivos originales de archivos combinados?
swapnil gandhi
3
@ ghostdog74: Creo que tiene que ser type file1.txt temp > out.txtpara agregar el segundo archivo, sin un encabezado al primero
Marius
61

Yo uso esto, y funciona bien para mí:

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

Por supuesto, antes de cada carrera, tienes que DELETE C:\Folder\ConcatenatedFile.csv

El único problema es que si todos los archivos tienen encabezados, se repetirá en todos los archivos.

Raj Más
fuente
2
Cuando ingreso un nombre de archivo para el archivo concatenado, lo que significa que aparece al final de los archivos en la ubicación (orden alfabético), ¡entonces Windows parece concatenarse dos veces! Terminé usando un nombre de archivo de 1filename.csv para no tener el problema. Supongo que concat en una carpeta diferente debería funcionar también ...
SebK
1
Si usa> en lugar de >>, no tiene que eliminar el archivo de antemano. > redirige la salida y crea el archivo nuevo cada vez. >> redirige la salida y agrega.
Eddie Deyo
1
¿Cómo omite esto la primera línea en el archivo 2, sobre la cual preguntó el OP?
Dan Dascalescu
1
No omite la primera línea del archivo2. Me perdí esa parte de la pregunta.
Raj More
1
¿Hay algún comando para recuperar archivos originales de archivos combinados?
swapnil gandhi
21

No tengo suficientes puntos de reputación para comentar sobre la recomendación que *.csv >> ConcatenatedFile.csvdebo usar , pero puedo agregar una advertencia:

Si crea un ConcatenatedFile.csvarchivo en el mismo directorio que está utilizando para la concatenación, se agregará a sí mismo.

John Faughnan
fuente
2
¿Cómo omite esto la primera línea en el archivo 2, sobre la cual preguntó el OP?
Dan Dascalescu
6

Use el comando FOR para hacer eco de un archivo línea por línea, y con la opción 'omitir' para omitir varias líneas de inicio ...

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

Puede redirigir la salida de un archivo por lotes, que contiene algo como ...

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

Tenga en cuenta el doble% cuando se utiliza una variable FOR dentro de un archivo por lotes.

Alberto Rossini
fuente
4

Aquí se explica cómo hacer esto:

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

Pondría esto en un comentario a ghostdog74, excepto que mi representante es demasiado bajo, así que aquí va.

more +2 file2.txt > temp
Este código realmente ignorará las filas 1 y 2 del archivo. OP desea mantener todas las filas del primer archivo (para mantener la fila de encabezado) y luego excluir la primera fila (presumiblemente la misma fila de encabezado) en el segundo archivo, por lo que para excluir solo la fila de encabezado que OP debe usar more +1.

type temp file1.txt > out.txt

No está claro qué orden resulta de este código. Se tempagrega a file1.txt(como se desee), o se file1.txtagrega a temp(no deseado ya que la fila del encabezado estaría enterrada en el medio del archivo resultante).

Además, estas operaciones tardan MUCHO TIEMPO con archivos grandes (por ejemplo, 300 MB)

Brian D
fuente
2

Sé que dijiste que no podías instalar ningún software, pero no estoy seguro de cuán estricta es esa restricción. De todos modos, tuve el mismo problema (tratando de concatenar dos archivos con presumiblemente los mismos encabezados) y pensé que proporcionaría una respuesta alternativa para otros que lleguen a esta página, ya que funcionó muy bien para mí.

Después de probar un montón de comandos en Windows y de sentirme muy frustrado, y también de probar todo tipo de editores gráficos que prometían poder abrir archivos grandes, pero luego no pudieron, finalmente volví a mis raíces de Linux y abrí mi Cygwin rápido. Dos comandos:

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

Para file1.csv800MB y file2.csv400MB, esos dos comandos tomaron menos de 5 segundos en mi máquina. En un aviso de Cygwin, nada menos. Pensé que se suponía que los comandos de Linux eran lentos en Cygwin, pero ese enfoque tomó mucho menos esfuerzo y fue mucho más fácil que cualquier enfoque de Windows que pude encontrar.

Andrew Mao
fuente
1

En powershell:

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

También puedes simplemente probar esto

type file2.txt >> file1.txt

Agregará el contenido de file2.txt al final de file1.txt

Si necesita el archivo original 1.txt, haga una copia de seguridad de antemano. O puedes hacer esto

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

Si desea tener un salto de línea al final del primer archivo, puede probar el siguiente comando antes de agregarlo.

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

La ayuda copyexplica que los comodines se pueden usar para concatenar múltiples archivos en uno.

Por ejemplo, para copiar todos los archivos .txt en la carpeta actual que comienzan con "abc" en un solo archivo llamado xyz.txt:

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

Esto toma Test.txtcon encabezados y agrega Test1.txty Test2.txtescribe resultados en el Testresult.txtarchivo después de quitar los encabezados del segundo y tercer archivo respectivamente:

type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt
usuario10301222
fuente