Dateiinhalte vergleichen - Neue Sätze dann ausgeben

DÖXIE

DÖXIE

Mitglied
Liebe Forumsmitglieder,
ich benöte mal wieder Eure Hilfe:
Ich möchte 2 Dateien vergleichen.
Datei-1 hat z.B. 100 Datensätze mit mehreren Feldern
Datei-2 hat z.B. 120 Datensätze mit den gleichen Feldern
Ich möchte nun ermitteln, welches die 20 Datensätze sind, welche neu bei Datei-2 hinzu gekommen sind.
Wo bei es mir völlig gleich ist, ob sich bei schon vorhandenen Sätzen im Datenfeld etwas geändert hat.
Also nur die neuen Datensätze.
Geht das ?
Ich habe es mit dem "grep" versucht - aber leider ohne Erfolg.
Für Eure Hilfe bin ich jetzt schon dankbar !!
Gruß,
Peter
 
Danke für den Hinweis.
ich bin leider mit der Ausgabe leicht überfordert - Bitte um Nachsicht :brav:

Ich versuch es mal besser zu beschreiben:
Also - Datei-1
1 2 3 4 5
a b c d e

Datei-2
1 2 3 5 4
a b c d e
z z z z z

Datei-3 soll jetzt nur "z z z z z" beinhalten.

Ich habe folgenden Befehl verwendet: sdiff Datei-1 Datei-2 > Datei-3
Unterschiede werden mir in Datei-3 mit "|"angezeigt - die zusätzlichen Sätze mit ">".
Wie schaffe ich es, nur die mit ">" gekennzeichneten Sätze in Datei-3 abzulegen ?

Vielen Dank !!
 
geht bestimmt eleganter aber so auf die Schnelle geht es wenn du mit

Code:
   ...     | grep \> | sed 's/^> //g'

weiter machst. Dann noch in eine Datei schieben >
 
Wenn Du nur die neu dazu gekommenen Zeilen haben willst:
* Zähle die Zeilen in A
* Zähle die Zeilen in B
* Berechne die Differenz
* Gib nur die letzten $Differenz Zeilen von A aus
 
vielen Dank !!
das funktioniert schon ganz gut:
diff Datei-1.dat Datei-2.dat | grep \> | sed 's/^> //g' >Datei-3.dat

Allerdings ist das Ergebnis in Datei-3.dat:
12354
abcde
zzzzz

"abcde" sollte nicht dabei sein (weil gleich in Datei-1 und Datei-2)
und 12354 eigentlich auch nicht (wäre aber nicht schlimm)

Nachtrag:

jetzt passt es. Ich hatte meine Testdateien mit dem Notepad++ erstellt.
Diese habe ich jetzt nochmal gelöscht und mit dem vi erstellt.

Ergebnis in Datei-3:
12354
zzzzz
 
Zuletzt bearbeitet:
Ich Dussel - ich habe zwei Befehle durcheinander geworfen.
sdiff und diff

Also nochmal von vorne:

Ich habe folgenden Befehl verwendet: sdiff Datei-1.dat Datei-2.dat > Datei-3.dat (inhalt siehe oben)
Unterschiede werden mir in Datei-3.dat mit "|"angezeigt - die zusätzlichen Sätze mit ">".
Wie schaffe ich es, nur die mit ">" gekennzeichneten Sätze in Datei-3 abzulegen ?

Wenn ich sdiff verwende, habe ich in meiner Datei-3 folgendes:
12345 |12354
abcde abcde
>zzzzz

(Das ">zzzzz" steht rechts. Wird hier nur falsch angezeigt.)

Diese Ausgabe möchte ich verwenden, damit nacher NUR zzzzz in Datei-3.dat auftaucht.
Ich brauche eigentlich nur die Sätze, welche mit dem ">" markiert sind.
Ich möchte mich für meine Dussligkeit gleich mal entschuldigen :rolleyes:
 
Zuletzt bearbeitet:
Sowas?
Code:
sdiff Datei-1.dat Datei-2.dat | grep \> | sed 's/^[ \t]*>[ \t]//g' > Datei-3.dat
 
Das sieht schon sehr gut aus - Vielen Dank :)

Ich habe das jetzt mal auf meine Originaldatei angewendet.
Da wird leider nur ein kleiner Teil eines jeden Satzes angezeigt, obwohl mehrere Felder im Satz vorhanden sind. Satzlänge 1002 Zeichen laut Notepad++.
Zeilenende ist in der Originaldatei: 0d 0a

Gibt es da Besonderes zu beachten ?
 
Es werden alle Zeilen von grosse_datei ausgegeben die nicht in kleine_datei enthalten sind.

Code:
awk 'FNR==NR{A[$0];next} !($0 in A){print $0}'  kleine_datei grosse_datei
 
Zuletzt bearbeitet:
@hellfire
vielen Dank - Das sieht auch gut aus. Besteht auch die Möglichkeit, die veränderten Sätze wegzulassen, dass also nur "zzzzz" auftaucht ?
 
Schau Dir mal die Option -w von sdiff an.
Aber ... ich bin mir grad nicht ganz sicher, ob das wirklich das ist, was Du willst ...
Beispiel.
Datei 1:
Code:
123
abc
Datei 2:
Code:
bla
132
abc
xyz

Nach Deiner Definition sind 'bla' und 'xyz' hinzugekommen und '123' wurde zu '132' verändert. Dies wird aber kein diff-Tool erkennen, da hier rein Zeichen/Zeichenketten verglichen werden.
 
wenn ich sdiff mit der w Option (in meinem Fall 1004) versehe:
sdiff -w1004 Datei-1.dat Datei-2.dat | grep \> | sed -e "s/^[ \t]*>[ \t]//g" > Delta.dat
funktioniert es :)
Allerdings: Das Satzende ist hex 0d 0a
Hier werden dann, wie auch immer, einige hex 09 zwischen 0d und 0a eingefügt.
Das umgehe ich im Moment, weil ich nicht viel Ahnung von UNIX habe, mit dem Notepad++ indem ich einfach die 09 entferne. Dann stimmt das Ergebnis.
Schöner wäre es natürlich, wenn die 09er gar nicht erst eingefügt würden.:think:
 
Zuletzt bearbeitet:
Das liegt am sdiff.
Häng an das sed einfach -e 's/\t*$//g' an ... dann sollten auch die Tabs am Ende verschwinden ...
 
How nice !!

sdiff -w1004 Datei-1.dat Datei-2.dat | grep \> | sed -e "s/^[ \t]*>[ \t]//g" | sed -e 's/\t*$//g' > Delta.dat

damit scheint es zu funktionieren :)
Jetzt prüfe ich noch genauer - aber ich denke das war's.
Vielen Dank erstmal an alle, die mir geholfen haben !!
 
> Wo bei es mir völlig gleich ist, ob sich bei schon vorhandenen
> Sätzen im Datenfeld etwas geändert hat. Also nur die neuen Datensätze.

> vielen Dank - Das sieht auch gut aus. Besteht auch die Möglichkeit, die
> veränderten Sätze wegzulassen, dass also nur "zzzzz" auftaucht ?


> Also - Datei-1
> 1 2 3 4 5
> a b c d e

> Datei-2
> 1 2 3 5 4
> a b c d e
> z z z z z

Was definierst Du in Deinen Beispiel als Datenfeld? Sind das 5 getrennte Felder? Sind die durch Leerzeichen oder Tabs getrennt? Ist das nur ein Zeichen oder ein mehrere Zeichen? Wenn man mehr weiss, sollte das grundsätzlich kein Problem sein.
 
@hellfire
Du hast recht.
Die Satzlänge ist 1003Byte + Satzendemarke 0x0d 0a.
Die einzelnen "Felder" sind nur durch 0x20 (Füllzeichen)getrennt.
 

Ähnliche Themen

Freezes Abstürze und bootcrashes

Dateien mit gleicher Größe löschen

Neuer Kernel kompiliert nicht

Squid als RPCoHTTPS Proxy für Outlook Anywhere

Newbie sucht Hilfe: Zahl aus Datei mit grep/cut/sed lesen und schreiben?

Zurück
Oben