Frage

Ich habe 2 CSV-Dateien, die ich vergleichen muss, und den Unterschied in eine neu formatierte Datei erhalten. Die Proben sind unten angegeben.

alte Datei generasacodicetagpre.

neue Datei generasacodicetagpre.

Ausgabedatei

Ich möchte die alten und neuen CSV-Dateien vergleichen und die Änderungen finden, die in der neuen Datei erfolgen und ein Flag aktualisieren, um diese Änderungen anzuzeigen

u - Wenn der neue Dateisatz aktualisiert wurde D - Wenn ein Datensatz in der alten Datei in der neuen Datei gelöscht wird N - Wenn ein Datensatz in der neuen Datei vorhanden ist, ist in der alten Datei nicht verfügbar

Die Beispielausgabedatei ist das. generasacodicetagpre.

Ich habe DIFF-Befehl verwendet, es wird jedoch auch den aktualisierten Datensatz wiederholen, der nicht ich möchte. generasacodicetagpre.

Ich habe einen AWK-Einzelzeilenbefehl verwendet, um auch meine Datensätze herauszufiltern generasacodicetagpre.

Das Problem damit ist, dass ich nicht die nicht der alten Datei gehörenden Datensätze erhalten. was ist generasacodicetagpre.

Ich habe auch ein angetriebenes Bash-Skript initiiert, um dies zu ärgern, aber nicht viel Hilfe mit einem guten Beispiel gefunden. generasacodicetagpre.

War es hilfreich?

Lösung

This might work for you:

diff  -W999 --side-by-side OLD NEW |
sed '/^[^\t]*\t\s*|\t\(.*\)/{s//\1 U/;b};/^\([^\t]*\)\t*\s*<$/{s//\1 D/;b};/^.*>\t\(.*\)/{s//\1 N/;b};d'
DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx U
DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc U
DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd D
DTL,77777777,7777777777777777,77777777777,N,N,ee,ee N

an awk solution along the same lines:

diff -W999 --side-by-side OLD NEW |
awk '/[|][\t]/{split($0,a,"[|][\t]");print a[2]" U"};/[\t] *<$/{split($0,a,"[\t]* *<$");print a[1]" D"};/>[\t]/{split($0,a,">[\t]");print a[2]" N"}'
DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx U
DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc U
DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd D
DTL,77777777,7777777777777777,77777777777,N,N,ee,ee N

Andere Tipps

A good starting point would probably be:

 diff -e OLD NEW

This outputs:

 5a
 DTL,77777777,7777777777777777,77777777777,N,N,ee,ee
 .
 1,3c
 DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx
 DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc

Meaning that it Added a record on line 5 (5a) and changed the records on lines 1 and 3 (1,3c).

If you can't use this format as-is (which would be good to use a standard) then you would need to write a script which converts it to the format that you describe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top