Dateien zeilenweise zusammenführen

720
Kard Nails

Zum Beispiel habe ich zwei Dateien:

FileA.txt

1

2

3.

FileB.txt

ABC

DEF

GHI

Und ich möchte fusionieren, um zu erhalten:

Ausgabe.txt

1.ABC

2. DEF

3. GHI

Ich muss jede Zeile zusammenführen, den Inhalt einer Datei am Anfang der Zeile und den Inhalt der anderen Datei danach einfügen. Ich kann es nicht manuell machen, da es mehr als 30 000 Zeilen gibt. Ich bin unter Windows, kann aber bei Bedarf Linux installieren.

Ich habe auf dieser Site und im Internet im Allgemeinen gesucht, aber nur wirklich alte und überholte Posts gefunden, Lösungen, die mehrere Dateien zusammenführen, aber nicht Zeile für Zeile, oder solche, die zu viel Codierungswissen erfordern, was mir fehlt. Ich habe auch versucht, Excel zu verwenden, um zwei Spalten zusammenzuführen, aber ich kann die Grenze von 256 Zeichen nicht umgehen. Wenn es bereits eine Antwort darauf gibt, habe ich sie vermisst. Jede Hilfe wird geschätzt. Vielen Dank.

0
Ich hätte denselben Ansatz gewählt. Woher hast du 256 Zeichen Limit? Sandeep vor 6 Jahren 0
@Sandeep Wenn Sie die Flash-Fill-Funktion in Excel verwenden, erhalte ich die Meldung, dass ich alle automatischen Zusammenführungen überarbeiten sollte, da der Inhalt aufgrund der Begrenzung von 256 Zeichen beschnitten wurde. Kard Nails vor 6 Jahren 0
Ich würde den Inhalt von `FileA.txt` in Spalte A von Excel und den Inhalt von` FileB.txt` in Spalte B kopieren. Dann speichern Sie als `.txt`-Datei. Öffnen Sie diese `.txt'-Datei in` Notepad ++ `und ersetzen Sie das` TAB`-Zeichen zwischen den Werten durch `.`. Sandeep vor 6 Jahren 2
@Sandeep Das war einfacher als ich es mir vorgestellt hatte. Vielen Dank. Wenn Sie eine Antwort posten, akzeptiere ich sie. Kard Nails vor 6 Jahren 0
Ich habe meine Antwort hinzugefügt. Sandeep vor 6 Jahren 0

6 Antworten auf die Frage

3
kenorb

Verwenden Sie den pasteBefehl, z

$ paste FileA.txt FileB.txt  1. ABC 2. DEF 3. GHI 

Anmerkung: Hinzufügen -d' ', um das Hinzufügen von Leerzeichen zwischen den Spalten zu vermeiden.

Um die Ausgabe in die neue Datei zu umleiten, anhängen: > NewFile.txt.

Unter Windows können Sie Git Shell oder Cygwin installieren . Oder verwenden Sie Docker für Windows .

Ich habe "paste" vergessen, was die naheliegende Lösung ist, obwohl in dem Beispiel in der Frage kein Trennzeichen zwischen den Zeilen jeder Datei vorhanden ist. Dazu benötigen Sie "paste -d" "FileA.txt FileB.txt" . AFH vor 6 Jahren 0
Wie kann ich direkt aus der Ausgabe heraus eine neue Datei erstellen? Es ist eine lange Datei ... Kard Nails vor 6 Jahren 0
Umleiten Sie einfach zu einer neuen Datei, wie zum Beispiel: `> new_file.txt`. kenorb vor 6 Jahren 0
1
JoeSlav

Unter Linux ein einfacher Befehl, der diff (der auf fast jedem Unix / Linux-System standardmäßig installiert ist) und sein -yFlag (Side-by-Side-Vergleich) nutzt und sedunerwünschte Leerzeichen / Tabulatoren entfernt, die vom Diff-Prozess eingefügt werden.

$ diff -y 1.txt 2.txt | sed 's/\s*|\t*//g' 1.a 2.b 3.c 

Angesichts der Dateien 1.txt :

1. 2. 3. 

und 2.txt :

a b c 

Bei den obigen Ausführungen wird davon ausgegangen, dass Sie Dateien mit der gleichen Anzahl von Zeilen haben und dass sich jede Zeile unterscheidet. Dies scheint der Fall Ihrer Anfrage zu sein.

Es tut mir leid, aber was? Was ist diff und was ist das für ein Liner? Wie gesagt, mein Wissen ist ziemlich begrenzt. Kard Nails vor 6 Jahren 0
Versucht, es erklärender zu machen. JoeSlav vor 6 Jahren 0
1
AFH

Eine allgemeine Linux-Lösung ist: -

E1=""; E2="" { while true do read -r <&3 && l1="$REPLY" || l1="" E1=e read -r <&4 && l2="$REPLY" || l2="" E2=e [ "$E1$E2" == ee ] && break echo "$l1$l2" done } 3<"$1" 4<"$2" 

Ich habe dies als Skript für die Lesbarkeit formatiert, aber es kann als lange Befehlszeile eingegeben werden, indem die neuen Zeilen durch Semikolons ersetzt werden $1und $2durch und die Pfade zu den zusammenzufügenden Dateien ersetzt werden.

Das funktioniert wie folgt: -

  • E1und E2sind Dateiende-Flags;
  • Zwei Eingabeströme (3 und 4) werden über die beiden übergebenen Dateipfade geöffnet.
  • Eine Linie wird von jeder Datei gelesen und gesetzt in Variablen l1und l2verbunden sind;
  • Beachten Sie, dass die read -r l1führenden und nachgestellten Leerzeichen entfernt werden, daher der komplexere Code zum Setzen l1(und l2);
  • Die Schleife wird beendet, wenn beide Dateien EOF erreichen, obwohl es eine triviale Änderung ist, wenn beide Dateien EOF erreichen.
  • Das echogeht zum Standard out oder >"$3"könnte zur Zeile hinzugefügt werden, wodurch die Ausgabedatei der dritte Parameter wird.
  • Der echoBefehl kann erweitert werden, wenn Sie eine Trennzeichenfolge hinzufügen möchten, um den Text von jeder Datei zu trennen.

Das obige Skript sollte in WSL (Windows Subsystem for Linux) in Windows 10 oder CygWin in früheren Windows-Versionen funktionieren.

Es wäre möglich, es zu implementieren cmd, aber ich möchte es nicht versuchen, obwohl es in der erweiterten cmdErsatz-Freeware TCC / LE unkompliziert wäre . Es sollte auch mit PowerShell möglich sein, aber ich habe nicht viel Erfahrung darin, da ich hauptsächlich Linux verwende.

1
kenorb

Verwenden Sie den Vim-Editor, z

  1. Öffnen Sie zwei Dateien side-by-side: vim FileA.txt FileB.txt -O.
  2. Wählen Sie in der ersten Datei vertikal zwei Spalten aus, indem Sie diese Tastenkombinationen drücken:

    1. 1, Shift- G(zum Anfang der Datei gehen).
    2. Control- V(Sichtblockiermodus aktivieren).
    3. Shift- G, $(wählen Sie zwei Spalten).
    4. y (Rucken / Kopieren in Puffer).
  3. Gehen Sie auf die nächste Datei durch Anschlagen: Control- w, w.
  4. Stellen Sie sicher, dass Sie in der ersten Zeile sind durch: 1, Shift- G.
  5. Klicken Sie in der ersten Zeile auf: Shift-, Pum vertikal einzufügen.
  6. Speichern und beenden Sie ( :wq).

Siehe die Demo:

asciicast


Um die obigen Schritte für größere Dateien zu automatisieren, zeichnen Sie entweder ein Makro auf und rufen es erneut auf, oder Sie können den exBefehl (Teil von Vim) verwenden, um die Dateien nicht interaktiv zu bearbeiten. Beispiel: So bearbeiten Sie Dateien nicht interaktiv (z Pipeline)?

Go kann in Sublime Text ein ähnliches Ergebnis erzielen, indem Sie entweder das Vintage-Plugin (Vim) verwenden oder indem Sie die Spalte Altvertikal auswählen, kopieren und in eine andere Datei einfügen.

1
RProgram

Verwenden Sie den CudaText- Editor mit der Funktion "Mehrfachauswahl".

  • Wählen Sie alles in Datei-1 aus
  • Rufen Sie "Auswahl / in Zeilen aufteilen" in Datei-1 auf
  • Alles in Datei-2 auswählen
  • Rufen Sie in Datei-2 "Auswahl / in Zeilen aufteilen" auf
  • In die Zwischenablage kopieren (viele Zeilen) in Datei-2
  • Drücken Sie in Datei-1 auf Ende, um die Einfügemarken an die Zeilenenden zu setzen
  • !! Stellen Sie sicher, dass die Anzahl der Einfügemarken in Datei-1 der Anzahl der in die Zwischenablage kopierten Zeilen entspricht (wenn nicht benötigte Einfügemarke am Ende vorhanden ist - Strg + Klicken Sie darauf, um sie zu löschen).
  • Wenn sie gleich sind, drücken Sie an den Zeilenenden Strg + V (Einfügen) - dies fügt die Zwischenablage Zeile für Zeile ein
0
Sandeep

Folgende Schritte können unternommen werden, um dies zu erreichen:

  1. Kopieren Sie den Inhalt der Datei FileA.txtin Spalte A der Excel-Tabelle
  2. Kopieren Sie den Inhalt der Datei FileB.txtin Spalte B der Excel-Tabelle
  3. Speichern Sie die Excel-Datei als .txtDatei
  4. .txtDatei öffnen inNotepad++
  5. Ersetzen Sie das TABZeichen mit '.'