
93578
15.11.2017, aktualisiert um 08:54:37 Uhr
2 grosse txt-Dateien zeilenweise vergleichen und Zeilen in der Datei1 ersetzen ohne Duplikate zu loeschen
Hallo an alle,
ich habe folgendes Problem:
Es existieren 2 txt-Dateien, die so aussehen:
1) (insgesamt 102.600.000 Zeilen)
2) (insgesamt 50.000.000 Zeilen)
Nun will ich die beiden Dateien zeilenweise vergleichen und die Zeilen in der Datei 1, die mit Zeilen der Datei 2 identisch sind (xxxx, yyyy, zzzz), so ersetzen:
Alle Duplikate in der Datei 1 müssen bleiben.
PS: Die Datein sind nicht sortiert! Falls es ohne Sortierung nicht geht oder zu lange dauern soll, kann ich sie natürlich sortieren.
PS2: Falls es einfacher ist auch so eine Lösung ist möglich: die gleiche Zeilen in der Datei 1 durch komplette Zeilen aus der Datei 2 ersetzen:
Kann mir jemand helfen?
ich habe folgendes Problem:
Es existieren 2 txt-Dateien, die so aussehen:
1)
xxxx
xxxx
xxxx
xxxx
yyyy
yyyy
yyyy
zzzz
zzzz
zzzz
2)
xxxx:abcd
yyyy:1234
zzzz:12ab
Nun will ich die beiden Dateien zeilenweise vergleichen und die Zeilen in der Datei 1, die mit Zeilen der Datei 2 identisch sind (xxxx, yyyy, zzzz), so ersetzen:
abcd
abcd
abcd
abcd
1234
1234
1234
12ab
12ab
12ab
Alle Duplikate in der Datei 1 müssen bleiben.
PS: Die Datein sind nicht sortiert! Falls es ohne Sortierung nicht geht oder zu lange dauern soll, kann ich sie natürlich sortieren.
PS2: Falls es einfacher ist auch so eine Lösung ist möglich: die gleiche Zeilen in der Datei 1 durch komplette Zeilen aus der Datei 2 ersetzen:
xxxx:abcd
xxxx:abcd
xxxx:abcd
xxxx:abcd
yyyy:1234
yyyy:1234
yyyy:1234
zzzz:12ab
zzzz:12ab
zzzz:12ab
Kann mir jemand helfen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 354886
Url: https://administrator.de/forum/2-grosse-txt-dateien-zeilenweise-vergleichen-und-zeilen-in-der-datei1-ersetzen-ohne-duplikate-zu-loeschen-354886.html
Ausgedruckt am: 07.05.2025 um 09:05 Uhr
20 Kommentare
Neuester Kommentar
Hier nochmal: der "große, ausführliche" Einzeiler inklusive Ausgaben:
lks
edit: XXXX durch Hampelmann ersetzt.
lks@nana:~/tmp$ echo -e "\nfile1.txt:\n==========" ; cat file1.txt ; echo -e "\nfile2.txt:\n==========" ; cat file2.txt ; cp file1.txt ziel.txt ; cat file2.txt | sed -e "s/:/\$:/1" | xargs -l1 -I Hampelmann1 echo "s:\^Hampelmann1:1" | xargs -l1 -I Hampelmann2 sed -e "Hampelmann2" -i ziel.txt ; echo -e "\nziel.txt:\n========" ; cat ziel.txt
file1.txt:
==========
xxxx
xxxx
xxxx
xxxx
yyyy
yyyy
yyyy
zzzz
zzzz
zzzz
file2.txt:
==========
xxxx:abcd
yyyy:1234
zzzz:12ab
ziel.txt:
========
abcd
abcd
abcd
abcd
1234
1234
1234
12ab
12ab
12ab
lks
edit: XXXX durch Hampelmann ersetzt.
Zitat von @93578:
XXXX - stehen im Script für 4 Zeichen und wie kann man bei einer verschiedenen Zeichenanzahl (0-99) nach dem Doppelpunkt vorgehen?
XXXX - stehen im Script für 4 Zeichen und wie kann man bei einer verschiedenen Zeichenanzahl (0-99) nach dem Doppelpunkt vorgehen?
nein. XXX ist der Parameter der "-I"-Option von xargs. damit wird dann in dem argument von xargs der parameter durch die zeile die xrags eingelesen hat ersetzt.
da könnte genausogut "Hampelmann" stehen.
lks

Das funktioniert aber nur solange er Sonderzeichen ($^.*\+() usw.) in seiner 2ten Datei mit Backslash escaped, denn sed arbeitet ja bekanntlich mit Regular Expressions in den Substitutions, du müsstest also noch ein sed "escaping" in die Pipeline dazwischen schieben.
Zitat von @134464:
Das funktioniert aber nur solange er Sonderzeichen ($^.*\+() usw.) in seiner 2ten Datei mit Backslash escaped, denn sed arbeitet ja bekanntlich mit Regular Expressions in den Substitutions, du müsstest also noch ein sed "escaping" in die Pipeline dazwischen schieben.
Das funktioniert aber nur solange er Sonderzeichen ($^.*\+() usw.) in seiner 2ten Datei mit Backslash escaped, denn sed arbeitet ja bekanntlich mit Regular Expressions in den Substitutions, du müsstest also noch ein sed "escaping" in die Pipeline dazwischen schieben.
Schon klar. Das war ja auch nur ein Quick'n-Dirty-Einzeiler für die oben spezifizierten Daten zum einmaligen Gebrauch zum anschließenden Entsorgen.
Für Recyclingzwecke zum regelmäßigen Gebrauch muß dann daraus eine schönes Skript mit diversen Behandlungen von Sonderfällen gebastelt werden.
lks

Wollte es nur erwähnen, nicht daß er nachher verwundert ist das bspw. ein
GG.F in Datei2
ein
GGHF in Datei1
ersetzt.
GG.F in Datei2
ein
GGHF in Datei1
ersetzt.
Moin,
Sind in den dateien außer dem Doppelpunkt Sonderzeichen wie z.b. Anfürhungsstriche, Hochkommate, Punkte etc.?
Dann mußt Du diese mit einem "Zwischenlauf" von "sed" auf die Dateie file2 mit einem bakshlash "\" escapen, wie Kollege Specht schon sagte.
Für den Punkt wäre das z.B.:
sed -e "s:\.:\\\\\.:g" oder so ähnlich. (Anzahl der bakslashes ggf. anpassen).
Für das Anführungszeichen echo "\"" | sed -e "s:\":\\\\\":g".
lks
Sind in den dateien außer dem Doppelpunkt Sonderzeichen wie z.b. Anfürhungsstriche, Hochkommate, Punkte etc.?
Dann mußt Du diese mit einem "Zwischenlauf" von "sed" auf die Dateie file2 mit einem bakshlash "\" escapen, wie Kollege Specht schon sagte.
Für den Punkt wäre das z.B.:
sed -e "s:\.:\\\\\.:g" oder so ähnlich. (Anzahl der bakslashes ggf. anpassen).
Für das Anführungszeichen echo "\"" | sed -e "s:\":\\\\\":g".
lks