Dateiinhalte vergleichen - Neue Sätze dann ausgeben

Ascii 0x20 ist ein Leerzeichen. Das macht das ganze also einfach.

Wiederholungsfrage: Was definierst Du in Deinen Beispiel als Datenfeld? Sprich Änderungen in welchem Feld zeigen dann an, dass es sich um neue Zeilen handelt? Am besten Du erklärst das an Hand von echten Testdaten, die Du bei Bedarf etwas anonymisierst.

Ich nehme mal an, dass das 1. Feld die Datensatz-ID ist. Somit würde das dann tun:

Code:
awk 'FNR==NR{A[$1];next} !($1 in A){print $0}'  kleine_datei grosse_datei
 
Zuletzt bearbeitet:
20160401Familienname Vorname Rufname JJJJMMTT Zusatz Ort Straße 535470010 07138006 0420160401 N 01 209000000861491 Ort-II Straße-II 565890021 07138010 000000000
Also FeldNr1: 8Byte lang = Erfassungs/Änderungsdatum
FeldNr2: Familienname (ab Byte 9 / 45Byte lang) Nicht gefüllte Bytes werden mit 0x20 aufgefüllt usw.

Das sind die Datenfelder, und da kommen irgendwo mal Änderungen vor. Straße ändert sich usw.
Es werden aber auch mal neue Sätze erfasst. Genau diese benötige ich aber NICHT die Sätze, in denen, in irgendeinem Feld, was geändert wurde.
 
Zuletzt bearbeitet:
Das könnte funktionieren.
Code:
awk 'FNR==NR{A[$2$3$4];next} !($2$3$4 in A){print $0}'  kleine_datei grosse_datei

Zum Thema:

Mit ungenauen Aussagen bekommst Du auch nur ungenaue Unterstützung. Die Frage wurde nicht beantwortet, was nicht zu berücksichtigende Datenfelder sind und was die Felder zu Identifikation. Also um so genauer Du Deine Problemstellung beschreibst, umso besser kann Dir geholfen werden.
 
Zuletzt bearbeitet:
Also:
Ich versuche es mal:
Initialisierte Satzlänge 1003 Bytes (alles 0x20). Das Satzende ist 0x0d0A.
Feld 01 von 1 bis 8 = JJJJMMTT
Feld 02 von 9 bis 53 = Familienname
Feld 03 von 54 bis 78 = Rufname
Feld 04 von 79 bis 138 = Vorname(n)
Feld 05 von 139 bis 183 = Zusatz zum Familiennamen
Feld 06 von 184 bis 198 = Doktorgrad
Feld 07 von 199 bis 208 = Geburtstag
usw.
Insgesammt 48 Datenfelder.

Am 01. eines jeden Monats werden die Daten abgefragt und am 15.
Natürlich kann ich nicht wissen, welche Felder in einem Satz in der Zwischenzeit verändert wurden.
Daher war meine Idee, wie ganz am Anfang beschrieben, den "sdiff" einzusetzen, da mir hier, auch schon wie beschrieben, sehr schön gezeigt wird, was die Änderungen "|" und was neue Sätze ">" sind. Leider stellte es sich heraus, dass der sdiff Probleme mit der Satzlänge hat (auch mit der -w Option)
Der "diff" ist auch nicht verkehrt, allerdings im Ergebnis schwieriger zu analysieren.
Trotzdem, nochmals danke für Eure Hilfe.
 
Zuletzt bearbeitet:
Ja, was kennzeichnet denn nun einen neuen Satz und was einen geänderten?

Mein letzter Vorschlag war Familienname+Rufname+Vorname als ID zu verwenden. Die ändern sich ja recht selten und sollte recht eindeutig sein. Ich würde sagen, das tut.

Falls die Eindeutigkeit nicht gegeben ist, oder falls sich eine von den 3 Elementen doch mal ändert - was bei Familiennamen durchaus mal passiert - kannst Du ja den Identifikator $2$3$4 ja nochmal besser an Deine Erfordernisse anpassen.
 
Für sowas hat der Mensch eigentlich Datenbanken und IDs oder Timstamps erfunden.

Interessant wäre vielleicht, was sich hinter der Aussage
Am 01. eines jeden Monats werden die Daten abgefragt und am 15.
versteckt - weil irgendwo müssen die oben genannten Dateien ja her kommen und ich bin mir recht sicher, daß das System, welches diese bereitstellt von sich aus schon einen Lösung für die Fragen des TE bieten würde...
 
Die Daten kommen von einer Datenbank.
Und ja, natürlich könnten dort diverse Funktionen angewendet werden.
Aber es geht mir ja darum, die Dateien, welche ich von den Datenbänklern erhalte, zu bearbeiten.
Wenn sich jetzt herausstellt, dass das mit UNIX-Bordmitteln nicht möglich ist, werde ich andere Wege einschlagen.:search:
Was ich auf jeden Fall nicht möchte, ist eine Grundsatzdiskussion über Sinn und Unsinn. :brav:
Es kann sich jeder Feldinhalt ändern. Alleine, wenn ein Eingabefehler geschehen ist.
Extra gekennzeichnet sind die veränderten Felder nicht. Das ergibt sich nur aus der Vergleichsabfrage 01. und 15. jeden Monats.
Und wie schon beschrieben, ich versuche nur die NEUEN Datensätze zu erhalten.
 
eine des einfachsten Möglichkeiten hat übrigens noch keiner genannt:
Code:
grep
Nimm die alte Liste als Pattern-File und greppe damit invers über die neue Liste. Wenn wir davon ausgehen, daß wir nicht gerade über ein paar Mio Datensätze sprechen rennt das auch problemlos.

Noch ein bisserl Google-Foo zu den veschiedenen Grep-Optionen / Versionen / Aufrufen bezüglich Performance und Du wirst vermutlich auf einfache Art sehr glücklich. Ok, fast - geänderte Datensätze bekommst Du immer noch mitgeliefert.

Übrigens:
Was ich auf jeden Fall nicht möchte, ist eine Grundsatzdiskussion über Sinn und Unsinn. :brav:
ist aber manchmal nicht unumgänglich. So ein bisserl die "totes Pferd"-Thematik, wenn's nichts taugt muss man den Reiter durchaus drauf hinweisen dürfen, daß das so nichts wird...
 
# ok - Beide Befehle ergeben das Gleiche
# diff -W1003 Datei-1.dat Datei-2.dat | grep '^>' | sed -e 's/>//' >Delta.dat
# oder:
# awk 'FNR==NR{A[$0];next} !($0 in A){print $0}' Datei-1.dat Datei-2.dat >Delta.dat
# cat Delta.dat | wc -l

Damit könnte ich leben ;)
Es sind zwar ein paar geänderte Datensätze dabei - aber was soll's :winke:

PS: doch, den "grep" hatten wir gleich am Anfang siehe "Programmer78" :rolleyes:
 
Zuletzt bearbeitet:
# diff -W1003 Datei-1.dat Datei-2.dat | grep '^>' | sed -e 's/>//' >Delta.dat
Es gibt keine Fehlermeldung. Sondern im Ergebnis nur für mich die Herausforderung, dass auch vorhandene, geänderte Datensätze dabei sind.
 
das meinte ich nicht. Nur grep verwenden.
Code:
::::::::::::::
a
::::::::::::::
a a a a
b b b b
c c c c
d d d d
::::::::::::::
b
::::::::::::::
a a a a
f f f f
b b b b
c c c d
d d d d
e e e e
... dann
Code:
man grep
aufmerksam lesen und
Code:
grep -vf a b
anschauen.
 

Ä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