2010-03-19 6 views
105

Ich muss einige relativ große Textdateien verketten und würde dies lieber über die Befehlszeile tun. Leider habe ich nur Windows und kann keine neue Software installieren.Textdateien mit der Windows-Befehlszeile verketten und führende Zeilen löschen

type file1.txt file2.txt > out.txt 

ermöglicht es mir fast bekommen, was ich will, aber ich will nicht die erste Zeile von file2.txt in out.txt aufgenommen werden.

Ich habe festgestellt, dass more die Option +n hat, um eine Startlinie anzugeben, aber ich habe es nicht geschafft, diese zu kombinieren, um das gewünschte Ergebnis zu erhalten. Ich bin mir bewusst, dass dies in Windows nicht möglich ist, und ich kann immer out.txt von Hand bearbeiten, um die Zeile loszuwerden, aber gibt es eine einfache Möglichkeit, es über die Befehlszeile zu tun?

Antwort

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

oder Sie können copy verwenden. Siehe copy /? für mehr.

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

Natürlich! Ich hätte es jedoch vorgezogen, die Verwendung von temporären Dateien zu vermeiden. Ich habe versucht, Klammern, Pipes und James

+10

Ja, Sie setzen '/ b'. siehe bearbeiten – ghostdog74

+7

Ich würde hinzufügen, dass, wenn Sie alle Dateien verketten möchten, Sie können kopieren/b * .txt combined.txt, ohne die Dateien einzeln auflisten. – Phlucious

6

Verwenden Sie die FOR-Befehl, um eine Datei Zeile für Zeile Echo und mit dem ‚überspringen‘ Option, um eine Anzahl von Ausgangsleitungen zu verpassen ...

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

Sie den Ausgang eines umleiten könnte Batch-Datei, mit so etwas wie ...

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

Notiere die Doppel%, wenn eine FOR Variable in einer Batch-Datei verwendet wird.

2

Ich weiß, dass Sie gesagt haben, dass Sie keine Software installieren können, aber ich bin mir nicht sicher, wie eng diese Einschränkung ist. Wie auch immer, ich hatte das gleiche Problem (ich versuchte zwei Dateien mit vermutlich den gleichen Header zu verketten) und ich dachte, ich würde eine alternative Antwort für andere geben, die auf diese Seite kommen, da es einfach großartig für mich war.

Nach dem Versuch, eine ganze Reihe von Befehlen in Windows und frustriert zu sein, und auch alle Arten von grafischen Editoren, die große Dateien zu öffnen versprochen, aber dann nicht konnte, kehrte ich zu meinen Linux-Wurzeln zurück und öffnete meine Cygwin-Eingabeaufforderung. Zwei Befehle:

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

Für file1.csv 800MB und 400MB file2.csv, diese beiden Befehle nahm weniger als 5 Sekunden auf meinem Rechner. In einer Cygwin-Eingabeaufforderung nicht weniger. Ich dachte, dass Linux-Befehle in Cygwin langsam sein sollten, aber dieser Ansatz erforderte viel weniger Aufwand und war viel einfacher als jeder Windows-Ansatz, den ich finden konnte.

55

Ich benutze dies, und es funktioniert gut für mich:

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

Natürlich vor jedem Lauf, müssen Sie DELETE C:\Folder\ConcatenatedFile.csv

Das einzige Problem ist, dass, wenn alle Dateien Header haben, dann wird es in allen Dateien wiederholt.

+1

Wenn ich einen Dateinamen für die verkettete Datei eingeben, was bedeutet, dass es aufgeführt ist am ende der dateien in der location (alphabetisch sortiert), dann scheint windows zweimal zu verketten! Ich habe am Ende einen Dateinamen von 1filename.csv verwendet, um das Problem nicht zu haben. Ich denke, dass das Zusammenfassen in einen anderen Ordner auch funktionieren sollte ... – SebK

+0

Wenn Sie> statt >> verwenden, müssen Sie die Datei nicht vorher löschen. > leitet die Ausgabe um und erstellt die Datei jedes Mal neu. >> leitet die Ausgabe um und hängt an. –

+0

Wie überspringt das die erste Zeile in Datei2, nach der das OP gefragt hat? –

20

Ich habe nicht genug Ruf Punkte auf Empfehlung Kommentar *.csv >> ConcatenatedFile.csv zu verwenden, aber ich kann eine Warnung hinzu:

Wenn Sie ConcatenatedFile.csv Datei im gleichen Verzeichnis erstellen, die Sie für die Verkettung verwenden wird es sein zu sich selbst hinzugefügt.

+1

Wie überspringt das die erste Zeile in Datei2, nach der das OP gefragt hat? –

2

Ich würde dies in einen Kommentar zu ghostdog74 setzen, außer mein rep ist zu niedrig, also hier geht.

more +2 file2.txt > temp
Dieser Code wird tatsächlich Zeilen 1 und 2 der Datei ignorieren. OP möchte alle Zeilen aus der ersten Datei behalten (um die Kopfzeile zu behalten) und dann die erste Zeile (vermutlich die gleiche Kopfzeile) von der zweiten Datei ausschließen, so dass nur die Kopfzeile OP verwendet werden sollte, sollte more +1 verwendet werden.

type temp file1.txt > out.txt

Es ist unklar, in welcher Reihenfolge ergibt sich aus diesem Code. Ist temp an file1.txt angehängt (wie gewünscht) oder ist file1.txt an temp angehängt (unerwünscht, da die Kopfzeile in der Mitte der resultierenden Datei vergraben wäre).

Darüber hinaus nehmen diese Operationen eine wirklich lange Zeit mit großen Dateien (zum Beispiel 300 MB)

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

Hier sind, wie dies zu tun:

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