AWK & SED



  • Hallo,

    ich habe ein kleines Problem, ich habe 2 Dateien, die ich miteinander vergleichen will:
    datei1 -> ca.300000 Zeilen
    datei2 -> ca.120000 Zeilen

    Ich möchte alle Dateien angezeigt bekommen bzw in eine Datei umleiten, die in datei1 sind aber NICHT in datei2.
    Mit diff geht es nicht so, die Darstellung klappt nicht.

    mit

    cat datei1 |grep -v -f datei2 > diff.txt
    

    geht es auch nicht, da kommt der Fehler: grep: Invalid back reference
    Ich denke mal Dateien zu gross 😞

    Nun meine Frage kann ich dass nicht mit awk,sed erledigen, muss aber sagen, habe von den 2 Programmen NULL Ahnung.

    Kann mir jmd. einen Tipp geben? 😕

    Gruss Alex



  • Hi,

    hängt davon ab, was in den Dateien steht. Gibt es Zeilen, die mehrmals vorkommen?



  • Hallo,

    kann eigentlich nicht sein, es ist eine Dateiliste vom Filesystem:
    /etc/
    /etc/fstab/
    /etc/init.d/
    /etc/init.d/rc3./

    usw.

    dürfte eigentlich nichts doppelt sein in der Datei?

    Machst das so viel aus? 😕

    Danke

    Gruss Alex



  • Hi,

    das hängt auch wieder davon ab, was man tun will.

    Ich denke, das Einfachste wäre:
    1. Beide Dateien in eine temporäre Datei umleiten
    2. Sortieren und...
    3. Mit uniq -d die Zeilen anzeigen, die doppelt sind

    Das würde natürlich nur Sinn machen, wenn die 12000 Zeilen eine Untermenge von den 30000 Zeilen wären.

    Wenn dem so ist, wären nach dem Zusammenführen der beiden Dateien bestimmte Einträge doppelt. Das wiederum wären ja dann die, die in beiden Textdateien vorkommen. Stimmt doch soweit, oder?



  • hmm also ohne optimierung 300k strings in 120k strings zu suchen, braucht 36000000000 string-vergleiche. wenn jeder vergleich in ca 100ns erledigt wird, braucht das alles eine stunde, wenn ich mich jetzt nicht verrechnet habe. könnte also etwas dauern. sag mal bitte, was genau du erreichen willst und ob du das öfters machen willst oder nur einmal.
    wenn du es mit grep machen willst, kannst du die option -F probieren. die sieht die pattern dann als einfache strings und nicht regex an.



  • Hallo,

    die Option beim grep -F funktioniert nicht ,beim Ergebnis kommt dann die 300K Datei -1 Zeile raus???
    Ich möchte das eigentlich nur einmal machen, sollte es zeitlich nicht so kritisch werden, dann könnte ich mir vorstellen, dass öfters laufen zu lassen.

    Das mit dem uniq -d zeigt er mir ja alle doppelten, also alle die in beiden Dateien vorhanden sind, ich brauche aber die nicht doppelt sind also nur in der großen 300K Datei sind ...

    Das stimmt die 120K sind eine Untermenge der 300K

    Zielt doch auf AWK & SED?

    Gruß Alex 😕



  • Hi,

    dann nimm nicht uniq -d, sondern einfach uniq -u. Dann hast du alle, die nicht in der kleineren Datei sind.

    Wieso meinst du, dass AWK & SED die Zaubermittel sind? Du müsstest, wie namenlos schrieb, Zeile für Zeile vergleichen. Also ohne ein Skript, wo ja meinetwegen AWK & SED irgendwie eingesetzt werden können, wird das nix. Aber ich glaube, dass wenn ich deine Anforderungen richtig verstanden habe, meine Lösung die einfachere und schnellere wäre.



  • CarstenJ schrieb:

    Aber ich glaube, dass wenn ich deine Anforderungen richtig verstanden habe, meine Lösung die einfachere und schnellere wäre.

    Ich auch. Eine effiziente Lösung mit Awk&Sed würde im Grunde ja nichts anderes machen, als genau das von Dir beschriebene Verhalten nachzubasteln.

    Insofern wohl eher sinnlos, hier unbedingt Awk und Sed verwenden zu wollen.



  • Hallo,

    ich habe mal uniq -u ausprobiert, es komm Näherungsweise hin, aber da kann was nicht stimmen:

    Wenn die 121K-Zeilen Datei eine Untermenge der 292K-Zeilen Datei ist, dann müßte als Ergebnis bei uniq -u (292K-121K)-Zeilen=170K-Zeilen rauskommen, ABER bei mir kommen 192K-Zeilen raus?

    Da stimmt doch was nicht?

    Gruss Alex



  • Hast Du sortiert? Kommen irgendwo in den Ursprungsdaten bereits Zeilen doppelt vor?


Anmelden zum Antworten