93578

2 txt-Dateien vergleichen und gleiche Zeilen in der Datei 1 durch die Zeilen aus der Datei 2 ersetzen

Hallo,

ich habe folgendes Problem: Es existieren zwei Text-Dateien, die so aussehen:

1)
xxxx
aaaa
xxxx
xxxx
xxxx
yyyy
yyyy
yyyy
zzzz
zzzz
(insgesamt 102.600.000 Zeilen)

2)
aaaa:D\'0%k  
xxxx:H\'0%k  
yyyy:\';äß:  
zzzz:=-][p\';  
(insgesamt 50.000.000 Zeilen)

Nun würde ich die beiden Dateien gerne zeilenweise vergleichen und die Zeilen in der ersten Datei, die mit Zeilen der zweiten Datei identisch sind (xxxx, yyyy, zzzz), so ersetzen:

aaaa:D\'0%k  
xxxx:H\'0%k  
xxxx:H\'0%k  
xxxx:H\'0%k  
yyyy:\';äß:  
yyyy:\';äß:  
yyyy:\';äß:  
zzzz:-][p\';  
zzzz:-][p\';  


Die Duplikate in der ersten Datei müssen drin bleiben.

Hat jemand deine Idee?

Ich habe gleiche Frage zwar schon mal im Linux-Forum gestellt, habe aber die richtige Lösung aber leider nicht gefunden (wegen vielen Sondernzeichen).

Danke
Auf Facebook teilen
Auf X (Twitter) teilen
Auf Reddit teilen
Auf Linkedin teilen

Content-ID: 354924

Url: https://administrator.de/forum/2-txt-dateien-vergleichen-und-gleiche-zeilen-in-der-datei-1-durch-die-zeilen-aus-der-datei-2-ersetzen-354924.html

Ausgedruckt am: 11.05.2025 um 21:05 Uhr

colinardo
Lösung colinardo 16.11.2017 aktualisiert um 10:23:24 Uhr
Goto Top
Servus,
z.B. in dieser Manier.
import io
STRFILE1 = 'txt1.txt'  
STRFILE2 = 'txt2.txt'  
STRFILERESULT = 'result.txt'  
fIN = open(STRFILE1,'r')  
strContent = fIN.read()
fIN.close()

with open(STRFILE2,'r') as f:  
    for line in f:
        mapping = line.split(":",1)  
        strContent = strContent.replace(mapping,mapping[1].rstrip())

fOUT = open(STRFILERESULT,'w')  
fOUT.write(strContent)
fOUT.close()
Grüße Uwe
93578
93578 16.11.2017 aktualisiert um 10:43:12 Uhr
Goto Top
Hallo Uwe,

Vielen Dank, das ist das was ich suchte!

Falls noch jemand gleiche in Perl braucht (läuft aber dreifach so langsam wie Phyton):

#!/usr/bin/perl

use strict;

my $p = "/usr/local/bin/_SCRIPTE/test";  
my $p_A = "$p/file2.txt";  
my $p_B = "$p/file1.txt";  
my $p_C = "$p/Ergebnis.txt";  

open C, ">$p_C" or print "Kann die Datei -$p_C- nicht oeffnen.\n";  

open A, "<$p_A" or print "Kann die Datei -$p_A- nicht oeffnen.\n";  
my @pass = <A>;
close A;

open B, "<$p_B" or print "Kann die Datei -$p_B- nicht oeffnen.\n";  

while (my $z1 = <B>) {
  chomp($z1);
  my ($hash) = grep /$z1/, @pass;
  if ($hash) {
    chomp($hash);
    print C "$hash\n";  
#    print "Zeile: $hash\n"; 
  }


}
close B;
close C;