PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Abgleich von ASCII-Dateien



DieterH
07-02-2011, 15:18
Hallo,

ich möchte eine Textdatei (*.txt) gegen eine Referenzdatei (ebenfalls *.txt; "Wörterbuch") abgleichen. Das Ergebnis soll eine Datei sein von Zeichenketten, die in der erstgenannten Datei vorkommen, NICHT aber in der Referenzdatei.

Die Zeilen der erstgenannten Textdatei und die Referenzdatei bestehen jeweils nur aus einem "Wort" (Buchstabenfolgen).

Zur Zeit löse ich die Aufgabe, indem ich an die Zeilen der erstgenannten Datei einen Feldtrenner (z.B. "!") und die Zeichenkette "0", an die Zeilen der Referenzdatei den gleichen Zeilentrenner sowie die Zeichenkette "1" anhänge. Dann beide Dateien in einen Topf, sortieren, und mit einer etwas umständlichen Logik in awk die Aufgabe löse.

Geht es mit Unix-Boardmitteln auch einfacher und wie?

Beispiel:

Erstgenannte Datei:
Hund
Katze
Maus

Referenzdatei:
Katze
Giraffe
Löwe
Elefant

Soll-Ergebnis des Abgleichs:
Hund
Maus

Vielen Dank im voraus!

Gruss
Dieter

John W
07-02-2011, 16:42
Ganz einfach:


diff erstgenannte_datei referenzdatei | sed -nr 's#^< (.+)$#\1#p'

msi
07-02-2011, 16:43
zB so:


perl -ne 'BEGIN { open(fh,"referenzdatei"); $t{$_}=1 while(<fh>); } print if !$t{$_}' ersteDatei

msi
07-02-2011, 16:46
Ganz einfach:


diff erstgenannte_datei referenzdatei | sed -nr 's#^< (.+)$#\1#p'


funktioniert halt nicht wenn die dateien nicht sortiert sind..



$ cat 1
Katze
Maus
Löwe
Hund
$ cat 2
Giraffe
Löwe
Elefant
Katze
$ diff 1 2 | sed -nr 's#^< (.+)$#\1#p'
Katze
Maus
Hund


Katze ist hier leider falsch

John W
07-02-2011, 16:50
Ah, sortieren wär auch noch nötig, stimmt...
Dann halt so:


diff <(sort erstgenannte_datei) <(sort referenzdatei) | sed -nr 's#^< (.+)$#\1#p'
*verzweifelt-gegen-perl-ankämpf* :rolleyes:

DieterH
07-02-2011, 17:01
Vielen Dank für eure Lösungen!

... und schon ist der Abend "gesichert" :lol:

Gruss
Dieter