2010-03-19 34 views
105

Ho bisogno di concatenare alcuni file di testo relativamente grandi e preferirei farlo tramite la riga di comando. Purtroppo ho solo Windows e non posso installare un nuovo software.Concatena i file di testo con la riga di comando di Windows, eliminando le linee principali

type file1.txt file2.txt > out.txt 

mi permette di ottenere quasi quello che voglio, ma non voglio che la prima linea di file2.txt da includere nel out.txt.

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

risposta

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

oppure è possibile utilizzare copy. Vedi copy /? per ulteriori informazioni.

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

Certo! Avrei preferito aver comunque evitato l'uso di file temporanei. Ho provato a usare parentesi, pipe e James

+10

sì, metti '/ b'. vedi edit – ghostdog74

+7

Vorrei aggiungere che se vuoi concatenare TUTTI i file puoi fare "copia/b * .txt combined.txt' senza dover elencare i file singolarmente. – Phlucious

6

Utilizzare il comando FOR eco un file riga per riga, e con il 'saltare' opzione per perdere un certo numero di linee a partire ...

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

Si potrebbe 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 una variabile FOR viene utilizzata all'interno di un file batch.

2

So che hai detto che non è possibile installare alcun software, ma non sono sicuro di quanto sia stretta questa restrizione. 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 intero gruppo di comandi in Windows ed essere seriamente 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 potevano, sono finalmente tornato alle mie radici Linux e ha aperto il mio prompt Cygwin. Due comandi:

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

Per file1.csv 800MB e 400MB file2.csv, questi due comandi hanno meno di 5 secondi sulla mia macchina. In un prompt 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 di Windows che potessi trovare.

55

Io uso questo, e funziona bene per me:

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

Naturalmente, prima di ogni corsa, si deve DELETE C:\Folder\ConcatenatedFile.csv

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

+1

Quando inserisco un nome file per il file concatenato, il che significa che è elencato alla fine dei file nella loaction (in ordine alfabetico), Windows sembra concatenare due volte! Ho finito per utilizzare un nome file di 1filename.csv per non avere il problema. Immagino che la concatenazione in una cartella diversa dovrebbe funzionare anche ... – SebK

+0

Se si usa> invece di >>, non è necessario cancellare il file in anticipo. > reindirizza l'output e crea il file ogni volta nuovo. >> reindirizza l'output e aggiunge. –

+0

Come si salta la prima riga nel file2, su cui l'OP ha richiesto? –

20

Non ho punti reputazione abbastanza per commentare la raccomandazione di utilizzare *.csv >> ConcatenatedFile.csv, ma posso aggiungere un avvertimento:

Se si crea ConcatenatedFile.csv file nella stessa directory che si sta utilizzando per la concatenazione sarà aggiunto a se stesso.

+1

Come si salta la prima riga nel file2, su cui l'OP ha richiesto? –

2

Vorrei mettere questo in un commento a ghostdog74, tranne il mio rappresentante è troppo basso, quindi ecco qui.

more +2 file2.txt > temp
Questo codice sarà effettivamente ignorare le righe 1 e 2 del file. OP vuole mantenere tutte le righe dal primo file (per mantenere la riga di intestazione), e quindi escludere la prima riga (presumibilmente la stessa riga di intestazione) sul secondo file, in modo da escludere solo la riga di intestazione OP dovrebbe usare more +1.

type temp file1.txt > out.txt

Non è chiaro cosa risultati ordina da questo codice. È temp aggiunto a file1.txt (come desiderato) o file1.txt aggiunto a temp (indesiderato poiché la riga di intestazione sarebbe nascosta nel mezzo del file risultante).

Inoltre, queste operazioni richiedere un tempo molto lungo con file di grandi dimensioni (ad esempio 300 MB)

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

Ecco come fare:

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