93578
Goto Top

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

Content-Key: 354924

Url: https://administrator.de/contentid/354924

Printed on: April 23, 2024 at 07:04 o'clock

Member: colinardo
Solution colinardo Nov 16, 2017 updated at 09:23:24 (UTC)
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
Mitglied: 93578
93578 Nov 16, 2017 updated at 09:43:12 (UTC)
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;