Concatena i file di testo con la riga di comando di Windows, eliminando le righe iniziali


127

Devo concatenare alcuni file di testo relativamente grandi e preferirei farlo tramite la riga di comando. Purtroppo ho solo Windows e non riesco a installare nuovo software.

type file1.txt file2.txt > out.txt

mi permette quasi di ottenere quello che voglio, ma non voglio che la prima riga di file2.txt sia inclusa in out.txt.

Ho notato che moreha l' +nopzione per specificare una linea di partenza, ma non sono riuscito a combinarli per ottenere il risultato che desidero. Sono consapevole che questo potrebbe non essere possibile in Windows e posso sempre modificare out.txt a mano per sbarazzarmi della linea, ma esiste un modo semplice per farlo dalla riga di comando?

Risposte:


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

oppure puoi usare copy. Vedi copy /?di più.

copy /b temp+file1.txt  out.txt

4
Ovviamente! Avrei preferito comunque evitare l'uso di file temporanei. Ho provato a usare parentesi, pipe e <per ottenerlo in un solo comando, ma non sono riuscito ad arrivare da nessuna parte. Il copycomando è molto più veloce, ma mette un carattere SUB alla fine. c'è un modo per evitarlo?
James,

18
Aggiungo che se si desidera concatenare TUTTI i file, è possibile fare copy /b *.txt combined.txtsenza dover elencare i file singolarmente.
Splendido

1
più apparentemente converti scheda in spazi, peccato!
Antonio,

esiste un comando per recuperare file originali da file uniti?
Swapnil Gandhi,

3
@ ghostdog74: Penso che debba essere type file1.txt temp > out.txteffettivamente quello di aggiungere il secondo file, senza un colpo di testa al primo
Marius,

61

Lo uso e funziona bene per me:

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

Certo, prima di ogni corsa, devi DELETE C:\Folder\ConcatenatedFile.csv

L'unico problema è che se tutti i file hanno delle intestazioni, verrà ripetuto in tutti i file.


2
Quando inserisco un nome file per il file concatenato, il che significa che è elencato alla fine dei file nella loaction (ordine alfabetico), Windows sembra concatenarsi due volte! Ho finito per usare un nome file di 1filename.csv per non avere il problema. Immagino che anche il concattamento in un'altra cartella dovrebbe funzionare ...
SebK,

1
Se si utilizza> anziché >>, non è necessario eliminare prima il file. > reindirizza l'output e crea il file nuovo ogni volta. >> reindirizza l'output e accoda.
Eddie Deyo,

1
In che modo questo salta la prima riga in file2, di cui l'OP ha chiesto?
Dan Dascalescu,

1
Non salta la prima riga in file2. Ho perso quella parte della domanda.
Raj Altro

1
esiste un comando per recuperare file originali da file uniti?
Swapnil Gandhi,

21

Non ho abbastanza punti reputazione per commentare la raccomandazione da usare *.csv >> ConcatenatedFile.csv, ma posso aggiungere un avviso:

Se si crea un ConcatenatedFile.csvfile nella stessa directory che si sta utilizzando per la concatenazione, verrà aggiunto a se stesso.


2
In che modo questo salta la prima riga in file2, di cui l'OP ha chiesto?
Dan Dascalescu,

6

Utilizzare il comando FOR per echeggiare un file riga per riga e con l'opzione 'skip' per perdere un numero di righe di partenza ...

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

Potresti reindirizzare l'output di un file batch, contenente qualcosa come ...

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

Nota il doppio% quando viene utilizzata una variabile FOR all'interno di un file batch.


4

Ecco come fare:

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

3

Vorrei inserire questo in un commento a ghostdog74, tranne per il fatto che il mio rappresentante è troppo basso, quindi ecco qui.

more +2 file2.txt > temp
Questo codice ignorerà effettivamente le righe 1 e 2 del file. OP desidera mantenere tutte le righe dal primo file (per mantenere la riga di intestazione), quindi escludere la prima riga (presumibilmente la stessa riga di intestazione) sul secondo file, quindi per escludere solo la riga di intestazione che OP deve utilizzare more +1.

type temp file1.txt > out.txt

Non è chiaro quale ordine derivi da questo codice. Viene tempaggiunto file1.txt(come desiderato) o file1.txtaggiunto temp(indesiderato poiché la riga di intestazione verrebbe seppellita nel mezzo del file risultante).

Inoltre, queste operazioni richiedono un TEMPO VERAMENTE LUNGO con file di grandi dimensioni (ad es. 300 MB)


2

So che hai detto che non puoi installare alcun software, ma non sono sicuro di quanto sia stretta questa limitazione. Ad ogni modo, ho avuto lo stesso problema (cercando di concatenare due file con presumibilmente le stesse intestazioni) e ho pensato di fornire una risposta alternativa per gli altri che arrivano a questa pagina, dal momento che ha funzionato perfettamente per me.

Dopo aver provato un sacco di comandi in Windows ed essere stato fortemente frustrato, e anche provare tutti i tipi di editor grafici che promettevano di essere in grado di aprire file di grandi dimensioni, ma poi non sono riuscito, sono finalmente tornato alle mie radici Linux e ho aperto il mio Cygwin richiesta. Due comandi:

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

Per file1.csv800 file2.csvMB e 400 MB, questi due comandi hanno impiegato meno di 5 secondi sulla mia macchina. In un prompt di Cygwin, niente di meno. Pensavo che i comandi di Linux dovessero essere lenti in Cygwin, ma quell'approccio richiedeva molto meno sforzo ed era molto più semplice di qualsiasi approccio Windows che riuscissi a trovare.


1

In PowerShell:

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

0

Puoi anche semplicemente provare questo

type file2.txt >> file1.txt

Aggiungerà il contenuto di file2.txt alla fine di file1.txt

Se hai bisogno di file1.txt originale, esegui prima un backup. Oppure puoi farlo

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

Se si desidera avere un'interruzione di riga alla fine del primo file, è possibile provare il comando seguente prima di aggiungere.

type file1.txt > out.txt
printf "\n" >> out.txt
type file2.txt >> out.txt

0

La guida per copyspiega che i caratteri jolly possono essere utilizzati per concatenare più file in uno.

Ad esempio, per copiare tutti i file .txt nella cartella corrente che iniziano con "abc" in un singolo file chiamato xyz.txt:

copy abc*.txt xyz.txt

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

-1

Questo prende Test.txtcon intestazioni e accoda Test1.txte Test2.txtscrive i risultati su Testresult.txtfile dopo aver rimosso rispettivamente le intestazioni dal secondo e terzo file:

type C:\Test.txt > C:\Testresult.txt && more +1 C:\Test1.txt >> C:\Testresult.txt && more +1 C:\Test2.txt >> C:\Testresult.txt
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.