Verketten Sie Textdateien mit der Windows-Befehlszeile und löschen Sie führende Zeilen

127

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.

type file1.txt file2.txt > out.txt

erlaubt mir fast zu bekommen, was ich will, aber ich möchte nicht, dass die erste Zeile von file2.txt in out.txt enthalten ist.

Ich habe festgestellt, dass morees die +nOption gibt, eine Startlinie anzugeben, aber ich habe es nicht geschafft, diese zu kombinieren, um das gewünschte Ergebnis zu erzielen. Ich bin mir bewusst, dass dies unter Windows möglicherweise nicht möglich ist, und ich kann out.txt immer von Hand bearbeiten, um die Zeile zu entfernen. Gibt es jedoch eine einfache Möglichkeit, dies über die Befehlszeile zu tun?

James
quelle

Antworten:

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

oder du kannst verwenden copy. Weitere copy /?Informationen finden Sie hier.

copy /b temp+file1.txt  out.txt
Ghostdog74
quelle
4
Natürlich! Ich hätte es jedoch vorgezogen, die Verwendung temporärer Dateien zu vermeiden. Ich habe versucht, Klammern, Pipes und <zu verwenden, um es in einen Befehl zu bringen, konnte aber nichts erreichen. Der copyBefehl ist viel schneller, setzt aber am Ende ein SUB-Zeichen. Gibt es eine Möglichkeit, dies zu vermeiden?
James
18
Ich würde hinzufügen, dass Sie, wenn Sie ALLE Dateien verketten möchten, dies tun können, copy /b *.txt combined.txtohne die Dateien einzeln auflisten zu müssen.
Phlucious
1
mehr scheinbar Tab in Leerzeichen umwandeln, schade!
Antonio
Gibt es einen Befehl zum Abrufen von Originaldateien aus zusammengeführten Dateien?
Swapnil Gandhi
3
@ Ghostdog74: Ich denke, es muss sein type file1.txt temp > out.txt, die zweite Datei tatsächlich ohne Header an die erste anzuhängen
Marius
61

Ich benutze das und es funktioniert gut für mich:

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

Natürlich muss man vor jedem Lauf DELETE C:\Folder\ConcatenatedFile.csv

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

Raj Mehr
quelle
2
Wenn ich einen Dateinamen für die verkettete Datei eingebe, was bedeutet, dass er am Ende der Dateien in der Loaction (alphabetische Reihenfolge) aufgeführt ist, scheint Windows zweimal zu verketten! Am Ende habe ich den Dateinamen 1filename.csv verwendet, um das Problem nicht zu haben. Ich denke, das Konatieren in einen anderen Ordner sollte auch funktionieren ...
SebK
1
Wenn Sie> anstelle von >> 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 sie an.
Eddie Deyo
1
Wie überspringt dies die erste Zeile in Datei2, nach der das OP gefragt hat?
Dan Dascalescu
1
Die erste Zeile in Datei2 wird nicht übersprungen. Ich habe diesen Teil der Frage verpasst.
Raj More
1
Gibt es einen Befehl zum Abrufen von Originaldateien aus zusammengeführten Dateien?
Swapnil Gandhi
21

Ich habe nicht genügend Reputationspunkte, um die zu verwendende Empfehlung zu kommentieren *.csv >> ConcatenatedFile.csv, aber ich kann eine Warnung hinzufügen:

Wenn Sie eine ConcatenatedFile.csvDatei in demselben Verzeichnis erstellen , das Sie für die Verkettung verwenden, wird sie zu sich selbst hinzugefügt.

John Faughnan
quelle
2
Wie überspringt dies die erste Zeile in Datei2, nach der das OP gefragt hat?
Dan Dascalescu
6

Verwenden Sie den Befehl FOR, um eine Datei zeilenweise wiederzugeben, und verwenden Sie die Option 'Überspringen', um eine Reihe von Startzeilen zu übersehen ...

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

Sie könnten die Ausgabe einer Batch-Datei umleiten, die so etwas wie ...

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

Beachten Sie das doppelte%, wenn eine FOR-Variable in einer Batchdatei verwendet wird.

Alberto Rossini
quelle
4

So geht's:

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

Ich würde dies in einen Kommentar zu ghostdog74 einfügen, außer dass mein Repräsentant zu niedrig ist.

more +2 file2.txt > temp
Dieser Code ignoriert tatsächlich die Zeilen 1 und 2 der Datei. OP möchte alle Zeilen aus der ersten Datei behalten (um die Kopfzeile beizubehalten) und dann die erste Zeile (vermutlich dieselbe Kopfzeile) in der zweiten Datei ausschließen, um nur die Kopfzeile auszuschließen, die OP verwenden sollte more +1.

type temp file1.txt > out.txt

Es ist unklar, welche Reihenfolge sich aus diesem Code ergibt. Wird tempangehängt an file1.txt(wie gewünscht) oder wird file1.txtangehängt an temp(unerwünscht, da die Kopfzeile in der Mitte der resultierenden Datei vergraben würde).

Darüber hinaus dauern diese Vorgänge bei großen Dateien (z. B. 300 MB) WIRKLICH LANGE.

Brian D.
quelle
2

Ich weiß, dass Sie gesagt haben, Sie könnten keine Software installieren, aber ich bin mir nicht sicher, wie streng diese Einschränkung ist. Wie auch immer, ich hatte das gleiche Problem (ich habe versucht, zwei Dateien mit vermutlich denselben Headern zu verketten) und dachte, ich würde eine alternative Antwort für andere geben, die auf diese Seite gelangen, da es für mich einfach großartig funktioniert hat.

Nachdem ich eine ganze Reihe von Befehlen in Windows ausprobiert hatte und sehr frustriert war und auch alle möglichen grafischen Editoren ausprobiert hatte, die versprachen, große Dateien öffnen zu können, aber dann nicht konnten, kehrte ich endlich zu meinen Linux-Wurzeln zurück und öffnete meinen Cygwin prompt. Zwei Befehle:

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

Bei file1.csv800 MB und file2.csv400 MB dauerten diese beiden Befehle auf meinem Computer weniger als 5 Sekunden. In einer Cygwin-Eingabeaufforderung nicht weniger. Ich dachte, Linux-Befehle sollten in Cygwin langsam sein, aber dieser Ansatz war weitaus weniger aufwendig und viel einfacher als jeder Windows-Ansatz, den ich finden konnte.

Andrew Mao
quelle
1

In Powershell:

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

Sie können dies auch einfach versuchen

type file2.txt >> file1.txt

Der Inhalt von file2.txt wird am Ende von file1.txt angehängt

Wenn Sie die Originaldatei1.txt benötigen, erstellen Sie zuvor eine Sicherungskopie. Oder du kannst das tun

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

Wenn Sie am Ende der ersten Datei einen Zeilenumbruch wünschen, können Sie vor dem Anhängen den folgenden Befehl ausführen.

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

In der Hilfe zu wird copyerläutert, dass Platzhalter verwendet werden können, um mehrere Dateien zu einer zu verketten.

So kopieren Sie beispielsweise alle TXT-Dateien im aktuellen Ordner, die mit "abc" beginnen, in eine einzelne Datei mit dem Namen xyz.txt:

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

Dies geschieht Test.txtmit Kopf- und anhängt Test1.txtund Test2.txtund schreibt Ergebnisse Testresult.txtDatei nach dem Header aus zweiten und dritten Dateien bzw. Strippen:

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