Dateivergleich (diff) mit Ausgabe der Spaltenunterschiede

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
becke
Beiträge: 365
Registriert: 29.11.2004 11:55:04
Wohnort: Ostwestfalen

Dateivergleich (diff) mit Ausgabe der Spaltenunterschiede

Beitrag von becke » 12.02.2009 10:14:56

Guten Morgen...

mich beschäftigt ein diff-Problem bei dem ich nicht recht weiter komme.
Ich habe versucht mit verschiedenen Programmen der Lösung näher zu kommen (cmp, comm, diff/gdiff).
Entweder habe ich eine entsprechende Option übersehen mir fehlt noch das passende Programm.

Ich möchte auf der Shell 2 ASCII-Dateien miteinander vergleichen und die Unterschiede verarbeiten.
Insbesondere interressieren mich die Spaltenpositionen der Unterschiede, ich zeig's mal besser mit einem Beispiel:

Datei 1:

Code: Alles auswählen

111111111 111111111 111111111
111111111 111111111 111111111
111111111 111111111 111111111
Datei 2:

Code: Alles auswählen

111111111 111111111 111111111
1111111119111111111 111911111
111111111 111111111 111111911
Als Unterschiede sollen jetzt als Spalten und Zeilen-Positionen ausgegeben werden, also sinngemäß diese Informationen:

Code: Alles auswählen

Zeile2: Spalte 10 und 24
Zeile3: Spalte 27
Die Art der Formatierung sei hier irrelevant, ich benötige aber die Spalteninformationen der jeweiligen unterschiedlichen Zeilen (aber nicht Feldbezogen, Felder gibt es hier nicht).
Achso, vorrausgesetzt sei hier mal, daß die Zeilenanzahl der 2 Dateien gleich ist.

Geht das irgendwie mit diff?
Bzw. kennt jemand ein Programm welches dies leistet?

Gruß + Danke,
Becke

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Dateivergleich (diff) mit Ausgabe der Spaltenunterschiede

Beitrag von Meillo » 12.02.2009 12:04:03

Ich würde wohl ein AWK-Script schreiben das von Hand vergleicht.
Fertige Tools dafür kenne ich nicht.
Use ed once in a while!

roli
Beiträge: 3174
Registriert: 10.09.2003 17:39:58

Re: Dateivergleich (diff) mit Ausgabe der Spaltenunterschiede

Beitrag von roli » 12.02.2009 12:25:05

Hi,

versuchs mal mit csvdiff. Setz das Trennzeichen auf z.B. "XYZ", damit wird dann die ganze Zeile als ein Feld "erkannt", und dir wird der erste Unterschied pro Zeile angezeigt. Das Leerzeichen als Feldtrenner entfaellt ja nach deinem Beispiel, sprich die Spaltenanzahl variiert, daher der seltsamme Trenner.
Roland


"Aber wenn du schon so unwissend bist, davon noch nicht gehört zu haben,
so will ich es doch als gut ansehen, daß du lieber einmal töricht fragst,
als weiterhin nichts von etwas zu wissen, das man doch wissen sollte."
aus "Die Edda des Snorri Sturluson", "Gylfis Täuschung"

Benutzeravatar
becke
Beiträge: 365
Registriert: 29.11.2004 11:55:04
Wohnort: Ostwestfalen

Re: Dateivergleich (diff) mit Ausgabe der Spaltenunterschiede

Beitrag von becke » 12.02.2009 13:20:02

csvdiff scheint theoretisch ganz gut geeignet zu sein, zumal ich auch eindeutige IDs in den Daten habe.
Ansonsten wird es wohl tatsächlich ein awk/sed/bash-script werden.

Danke erstmal, nun habe ich für eine Zeit lang wieder "Futter" :-)

Gruß,
Becke

Benutzeravatar
Meillo
Moderator
Beiträge: 9254
Registriert: 21.06.2005 14:55:06
Wohnort: Balmora
Kontaktdaten:

Re: Dateivergleich (diff) mit Ausgabe der Spaltenunterschiede

Beitrag von Meillo » 12.02.2009 22:41:47

becke hat geschrieben:Ansonsten wird es wohl tatsächlich ein awk/sed/bash-script werden.
Hier das passende AWK-Script :-D

Code: Alles auswählen

#!/usr/bin/awk -f
#
# diffs two text files
# prints number of differing lines and the column of each differing byte
#
# usage: the first two lines on stdin are the filenames to diff


BEGIN {
        getline file1;
        getline file2;

        while ((getline l1 <file1) > 0 && (getline l2 <file2) > 0) {
                line++;
                if (l1 != l2) {
                        printf "line: %d - col:", line;
                        for (i = 1; i <= ((length(l1) > length(l2)) ? length(l1) : length(l2)); i++) {
                                if (substr(l1, i, 1) != substr(l2, i, 1)) {
                                        printf(" %d", i);
                                }
                        }
                        print;
                }
        }
        if ((getline <file1) > 0) {
                print "trailing lines in:", file1;
        } else if ((getline <file2) > 0) {
                print "trailing lines in:", file2;
        }
}
Und hier eine beispielhafte Verwendung:

Code: Alles auswählen

< pantheon | meillo | /tmp >
    $ cat aa 
111111111 111111111 111111111
111111111 111111111 111111111
111111111 111111111 111111111

< pantheon | meillo | /tmp >
    $ cat bb
111111111 111111111 111111111
1111111119111111111 1119111112
111111111 111111111 111111911
4444

< pantheon | meillo | /tmp >
    $ ./locationdiff.awk 
aa
bb
line: 2 - col: 10 24 30
line: 3 - col: 27
trailing lines in: bb

< pantheon | meillo | /tmp >
    $
Viel Vergnügen damit!
Use ed once in a while!

Benutzeravatar
Duff
Beiträge: 6321
Registriert: 22.03.2005 14:36:03
Wohnort: /home/duff

Re: Dateivergleich (diff) mit Ausgabe der Spaltenunterschiede

Beitrag von Duff » 13.02.2009 08:47:01

Nicht schlecht!!!
Oh, yeah!

Benutzeravatar
becke
Beiträge: 365
Registriert: 29.11.2004 11:55:04
Wohnort: Ostwestfalen

Re: Dateivergleich (diff) mit Ausgabe der Spaltenunterschiede

Beitrag von becke » 13.02.2009 17:18:13

Holla, exact genau sowas!

Vielen Dank! :D

Antworten