Linux AWK, der zwei CSV-Dateien vergleicht und eine neue Datei mit einer Flagge erstellt
-
15-11-2019 - |
Frage
Ich habe 2 CSV-Dateien, die ich vergleichen muss, und den Unterschied in eine neu formatierte Datei erhalten. Die Proben sind unten angegeben.
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.
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.