Anzeige:
Ergebnis 1 bis 7 von 7

Thema: Linux 2 Dateien Vergleichen

  1. #1
    Registrierter Benutzer
    Registriert seit
    Dec 2019
    Beiträge
    14

    Smile Linux 2 Dateien Vergleichen

    Hallo zusammen,

    vielen Dank für die Aufnahme im Forum.

    Ich beschäftige mich seit geraumer Zeit zunehmend mit Linux und bin nun auf ein Problem gestoßen.

    Ich würde gerne 2 Files vergleichen.

    Davon ist $File1 meine selbst zusammengestellte Datei.
    $File2 ist eine Datei mit gleichem Aufbau nur unsortiert. Es gehören immer 2 Zeilen zu einem Datensatz. Ich möchte anhand der oberen oder unteren Zeile aus $File1 einen Vergleich mit $File2 machen, bedeutet wenn Zeile 1 oder Zeile 2 in $File1 vorhanden und identisch mit einer der gleichen Zeilen aus $File2 ist, dann sollen beide Zeilen (somit der gesamte Datensatz) aus $File1 gelöscht und mit den neuen Daten aus $File2 ersetzt werden.

    Das ganze sollte auf Ubuntu 16.04 oder auch 18.04 laufen.

    Ich habe mal versucht ein einfaches Beispiel zu machen.


    $File1 das geupdated werden muss.

    TestFILE
    EXT: id="testdomain/web" logo="andere-testdomain.com/8050" group-title="DE: Horizont
    http://testdomain.test/55555
    EXT: id="testdomain/local" logo="andere-testdomain.com/5030" group-title="DE: Berlin
    http://testdomain.test/66666



    $File2-Neu soll mit den bisherigen Datensätzen abgegelichen werden.

    TestFILE
    EXT: id="testdomain/web" logo="andere-testdomain.com/8050" group-title="DE: Horizont
    http://testdomain.test/65984
    EXT: id="testdomain/local" logo="andere-testdomain.com/5030" group-title="DE: Berlin
    http://testdomain.test/31347
    EXT: id="shouldbeignored.test" logo="shouldbeignored.test" group-title="DE: Berlin
    http://shouldbeignored.test/654521


    $File1 sollte nach dem Vergleich wie folgt aussehen. (2 Datensätze sollten dann hier drinnen stehen, der dritte Datensatz aus $File2 müssten dann ignoriert werden da dieser nicht im $File1 vorkommt)

    TestFILE
    EXT: id="testdomain/web" logo="andere-testdomain.com/8050" group-title="DE: Horizont
    http://testdomain.test/65984
    EXT: id="testdomain/local" logo="andere-testdomain.com/5030" group-title="DE: Berlin
    http://testdomain.test/31347

    Ich hoffe hier kann mir jemand helfen.

    Liebe Grüße

    rodeoric

  2. #2
    kleine schwester von root Avatar von corresponder
    Registriert seit
    May 2002
    Ort
    192.67.198.56
    Beiträge
    4.578
    Stichwort: man diff
    bzw. nach "diff howto", in einer Suchmaschine deiner Wahl" suchen:
    z.b.
    https://www.computerhope.com/unix/udiff.htm
    Geändert von corresponder (19.12.19 um 21:58 Uhr)
    _______________________________________

    www.audio4linux.de - musik machen mit offenen quellen!

  3. #3
    Registrierter Benutzer
    Registriert seit
    Dec 2019
    Beiträge
    14
    Zitat Zitat von corresponder Beitrag anzeigen
    Stichwort: man diff
    bzw. nach "diff howto", in einer Suchmaschine deiner Wahl" suchen:
    z.b.
    https://www.computerhope.com/unix/udiff.htm
    Das hatte ich bereits gelesen, aber da scheint das Problem zu sein das immer 2 Zeilen = 1 Datensatz sind und er muss ja sowohl die obere und die untere abgleichen, ist eine von beiden verändert, soll diese Änderung ja dann übernommen werden.

    Vielleicht könntest Du mir mal den Anfang machen um das zu realisieren, Du scheinst ja schon ein "alter" Hase hier zu sein.

    Lg
    rodeoric

  4. #4
    Registrierter Benutzer
    Registriert seit
    Dec 2003
    Ort
    Dettenhausen
    Beiträge
    22.054
    ich würd's in Perl angehen.

    beide Files in ein Array einlesen, durch das Referenzfile durchgehen und dann die entsprechenden Datensätze im 2. File ergänzen oder ändern.

    Du hast aber vermutlich ein Konzeptproblem in dem Konstrukt, zumindest kannst Du mit der von Dir beschriebenen Methode in ein Endless-Loop laufen, weil sich ggf. Änderungen gegenseitig invalidieren.

    Alternativ sagst Du uns, was denn der konkrete Zweck dahinter sein soll.
    Ich bin root - ich darf das.

  5. #5
    Registrierter Benutzer
    Registriert seit
    Dec 2019
    Beiträge
    14
    Zitat Zitat von marce Beitrag anzeigen
    ich würd's in Perl angehen.

    beide Files in ein Array einlesen, durch das Referenzfile durchgehen und dann die entsprechenden Datensätze im 2. File ergänzen oder ändern.

    Du hast aber vermutlich ein Konzeptproblem in dem Konstrukt, zumindest kannst Du mit der von Dir beschriebenen Methode in ein Endless-Loop laufen, weil sich ggf. Änderungen gegenseitig invalidieren.

    Alternativ sagst Du uns, was denn der konkrete Zweck dahinter sein soll.

    Hallo marce,

    sorry für die verzögerte Antwort, aber der Vorweihnachtsstress wie jedes Jahr

    Ziel ist ein Abgleich von .m3u Listen.

    Bedeutet: Ich habe eine große .m3u Liste und nenne diese $File2, diese habe ich verkleinert und nenne diese $File1. Wenn nun jemand eine Änderung in $File2 schreibt, beispielsweise eine Änderung der URL oder aber auch eine Änderung des Coverpfades, dann möchte ich mit einem Linux System (vorzugsweise Ubuntu) in regelmäßigen Abständen prüfen ob es Änderungen in $File2 gegeben hat und diese sollten dann in $File1 geschrieben werden, allerdings sollten nur die Zeilen geschrieben werden die ich auch in $File1 habe. Dabei ist die Problematik eben wie gesagt das es sich bei jedem Datensatz immer um 2 Zeilen handelt.

    Ich hoffe das ist so besser nachvollziehbar.

    Lg
    rodeoric

  6. #6
    Registrierter Benutzer
    Registriert seit
    Apr 2009
    Ort
    Erde
    Beiträge
    2.814
    Ja, aber ich denke das Format ist nicht ganz korrekt, wiederum ändert das wenig am Problem. Für den Anfang: https://onlinegdb.com/HkK4HCiCr
    Code:
    '''
    2 Zeilen foo
    '''
    def createTestFiles():
        '''
        als aller erstes machen wir die beiden dateien
        '''
        f = open("file1.txt","w")
        f.write("EXT: id=\"testdomain/web\" logo=\"andere-testdomain.com/8050\" group-title=\"DE: Horizont\n")
        f.write("http://testdomain.test/55555\n")
        f.write("EXT: id=\"testdomain/local\" logo=\"andere-testdomain.com/5030\" group-title=\"DE: Berlin\n")
        f.write("http://testdomain.test/66666\n")
        f.close()
        f = open("file2.txt", "w")
        f.write("EXT: id=\"testdomain/web\" logo=\"andere-testdomain.com/8050\" group-title=\"DE: Horizont\n")
        f.write("http://testdomain.test/65984\n")
        f.write("EXT: id=\"testdomain/local\" logo=\"andere-testdomain.com/5030\" group-title=\"DE: Berlin\n")
        f.write("http://testdomain.test/31347\n")
        f.write("EXT: id=\"shouldbeignored.test\" logo=\"shouldbeignored.test\" group-title=\"DE: Berlin\n")
        f.write("http://shouldbeignored.test/654521\n")
        f.close()
    
    def readRecords(file):
        '''
        Wir wissen, dann ein Datensatz (aka Record) aus zwei Zeilen besteht
        Zeile 1 beginnt immer gleich, damit erkennen wir den Anfang
        Wir lesen den bzw. die Datensätze in eine Liste
        '''
        f = open(file, "r")
        records = []
        line = f.readline()
        while line:
            if (line.startswith("EXT:")):
                records.append([line, f.readline()])
            line = f.readline()
        return records
        
    def writeRecords(file, records):
        '''
        kleiner Helfer um eine Datensatzliste zu schreiben
        '''
        with open(file, "w") as f:
            for record  in records:
                f.write(record[0])
                f.write(record[1])
    
    def main():
        '''
        Hauptprogramm
        '''
        createTestFiles()
        records1 = readRecords("file1.txt")
        records2 = readRecords("file2.txt")
        
        for record1  in records1:
            ext1 = record1[0]
            uri1 = record1[1]
            for record2 in records2:
                ext2 = record2[0]
                uri2 = record2[1]
                equalExt = ext1 == ext2
                equalUri = uri1 == uri2
                if (equalExt != equalUri):
                    # wenn eine von beiden anders updaten, sonst nicht
                    # hinweis ich glaube ja, dass das nicht ganz ok ist
                    print("updating record:\n{}{}to:\n{}{}".format(ext1, uri1, ext2, uri2))
                    record1[0] = record2[0]
                    record1[1] = record2[1]
                    
        #ok nun schreiben wir das Ergebnis noch eine neue Datei
        writeRecords("file3.txt", records1)
    
    # hier geht es los
    main()
    Viel Spaß beim fertig machen.
    Geändert von nopes (21.12.19 um 18:24 Uhr) Grund: Typos
    Gruß nopes
    (,,,)---(^.^)---(,,,) /var/log/messages | grep cat

  7. #7
    Registrierter Benutzer
    Registriert seit
    Dec 2019
    Beiträge
    14
    Zitat Zitat von nopes Beitrag anzeigen
    Ja, aber ich denke das Format ist nicht ganz korrekt, wiederum ändert das wenig am Problem. Für den Anfang: https://onlinegdb.com/HkK4HCiCr
    Code:
    '''
    2 Zeilen foo
    '''
    def createTestFiles():
        '''
        als aller erstes machen wir die beiden dateien
        '''
        f = open("file1.txt","w")
        f.write("EXT: id=\"testdomain/web\" logo=\"andere-testdomain.com/8050\" group-title=\"DE: Horizont\n")
        f.write("http://testdomain.test/55555\n")
        f.write("EXT: id=\"testdomain/local\" logo=\"andere-testdomain.com/5030\" group-title=\"DE: Berlin\n")
        f.write("http://testdomain.test/66666\n")
        f.close()
        f = open("file2.txt", "w")
        f.write("EXT: id=\"testdomain/web\" logo=\"andere-testdomain.com/8050\" group-title=\"DE: Horizont\n")
        f.write("http://testdomain.test/65984\n")
        f.write("EXT: id=\"testdomain/local\" logo=\"andere-testdomain.com/5030\" group-title=\"DE: Berlin\n")
        f.write("http://testdomain.test/31347\n")
        f.write("EXT: id=\"shouldbeignored.test\" logo=\"shouldbeignored.test\" group-title=\"DE: Berlin\n")
        f.write("http://shouldbeignored.test/654521\n")
        f.close()
    
    def readRecords(file):
        '''
        Wir wissen, dann ein Datensatz (aka Record) aus zwei Zeilen besteht
        Zeile 1 beginnt immer gleich, damit erkennen wir den Anfang
        Wir lesen den bzw. die Datensätze in eine Liste
        '''
        f = open(file, "r")
        records = []
        line = f.readline()
        while line:
            if (line.startswith("EXT:")):
                records.append([line, f.readline()])
            line = f.readline()
        return records
        
    def writeRecords(file, records):
        '''
        kleiner Helfer um eine Datensatzliste zu schreiben
        '''
        with open(file, "w") as f:
            for record  in records:
                f.write(record[0])
                f.write(record[1])
    
    def main():
        '''
        Hauptprogramm
        '''
        createTestFiles()
        records1 = readRecords("file1.txt")
        records2 = readRecords("file2.txt")
        
        for record1  in records1:
            ext1 = record1[0]
            uri1 = record1[1]
            for record2 in records2:
                ext2 = record2[0]
                uri2 = record2[1]
                equalExt = ext1 == ext2
                equalUri = uri1 == uri2
                if (equalExt != equalUri):
                    # wenn eine von beiden anders updaten, sonst nicht
                    # hinweis ich glaube ja, dass das nicht ganz ok ist
                    print("updating record:\n{}{}to:\n{}{}".format(ext1, uri1, ext2, uri2))
                    record1[0] = record2[0]
                    record1[1] = record2[1]
                    
        #ok nun schreiben wir das Ergebnis noch eine neue Datei
        writeRecords("file3.txt", records1)
    
    # hier geht es los
    main()
    Viel Spaß beim fertig machen.
    Hallo,

    vielen lieben Dank für den Anfang.

    Ich muss da wohl etwas mehr Zeit investieren und habe nicht wirklich Ahnung von Python. Das bedarf Zeit.

    Vielen Dank.

    Lg
    rodeoric

Ähnliche Themen

  1. Dateien vergleichen
    Von dilindam im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 11.06.10, 21:07
  2. Verzeichnisse Dateien vergleichen
    Von minisalami im Forum Linux Allgemein
    Antworten: 2
    Letzter Beitrag: 19.01.10, 23:44
  3. 2 Dateien Vergleichen (mit GUI!)
    Von michiS im Forum Anwendungen Allgemein, Software
    Antworten: 11
    Letzter Beitrag: 18.12.06, 19:37
  4. Dateien mit md5-Inhalten vergleichen
    Von garaq im Forum Linux Allgemein
    Antworten: 3
    Letzter Beitrag: 04.07.05, 19:05
  5. mit ftp o.ä. dateien vergleichen
    Von Ic3cAk3 im Forum Linux als Server
    Antworten: 5
    Letzter Beitrag: 20.10.04, 14:41

Stichworte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •