linux awk de la comparaison de deux fichiers csv et la création d'un nouveau fichier avec un drapeau
J'ai 2 fichiers CSV que j'ai besoin de comparer et d'obtenir la différence d'un nouveau format de fichier. Les exemples sont donnés ci-dessous.
ANCIEN fichier
DTL,11111111,1111111111111111,11111111111,Y,N,xx,xx
DTL,22222222,2222222222222222,22222222222,Y,Y,cc,cc
DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd
DTL,44444444,4444444444444444,44444444444,Y,Y,ss,ss
DTL,55555555,5555555555555555,55555555555,Y,Y,qq,qq
NOUVEAU fichier
DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx
DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc
DTL,44444444,4444444444444444,44444444444,Y,Y,ss,ss
DTL,55555555,5555555555555555,55555555555,Y,Y,qq,qq
DTL,77777777,7777777777777777,77777777777,N,N,ee,ee
Fichier de sortie
Je veux comparer l'ancien et le nouveau fichiers CSV et de trouver les changements qui s'effectue dans le nouveau fichier et mettre à JOUR un DRAPEAU pour désigner ces changements
U - si le nouveau fichier d'enregistrement est mis à JOUR
D - si un enregistrement existant dans l'ancien fichier est supprimé dans le nouveau fichier
N - si un enregistrement existant dans le nouveau fichier n'est pas disponible dans l'ancien fichier
l'exemple de fichier de sortie est présent.
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
J'ai utilisé la commande diff mais il faudra répéter l'enregistrement mis à JOUR de trop qui n'est pas que je veux.
DTL,11111111,1111111111111111,11111111111,Y,N,xx,xx
DTL,22222222,2222222222222222,22222222222,Y,Y,cc,cc
DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd
---
DTL,11111111,1111111111111111,11111111111,Y,Y,xx,xx
DTL,22222222,2222222222222222,22222222222,Y,N,cc,cc
5a5
DTL,77777777,7777777777777777,77777777777,N,N,ee,ee
J'ai utilisé un AWK seule ligne de commande pour filtrer mes dossiers ainsi
awk 'NR==FNR{A[$1];next}!($1 in A)' FS=: old.csv new.csv
le problème, c'est ne pas me l'enregistre uniquement appartenant à l'ANCIEN fichier.
qui est
DTL,33333333,3333333333333333,33333333333,Y,Y,dd,dd
J'ai entamé un conduit script bash ainsi à ahieve cette mais il n'a pas trouver beaucoup d'aide avec un bon exemple.
myscript.awk
BEGIN {
FS = "," # input field seperator
OFS = "," # output field seperator
}
NR > 1 {
#flag
# N - new record D- Deleted U - Updated
id = $1
name = $2
flag = 'N'
# This prints the columns in the new order. The commas tell Awk to use the character set in OFS
print id,name,flag
}
>> awk -f myscript.awk old.csv new.csv > formatted.csv
OriginalL'auteur Sanath | 2012-03-02
Vous devez vous connecter pour publier un commentaire.
Cela pourrait fonctionner pour vous:
un awk solution dans le même sens:
PIF,11111112,1111111111111110,11111111112,Y,N,abcdefghijklmnopqrstuvwxyz123457,abcdefghijklmnopqrstuvwxyz654322 PIF,11111113,1111111111111111,11111111113,Y,N,abcdefghijklmnopqrstuvwxyz123458,abcdefghijklmnopqrstuvwxyz654323 PIF,11111114,1111111111111112,11111111114,Y,N,abcdefghijklmnopqrstuvwxyz123459,abcdefghijklmnopqrstuvwxyz654324 DTL,11111115,1111111111111123,11111111115,Y,N,abcdefghijklmnopqrstuvwxyz123460,abcdefghijklmnopqrstuvwxyz654325
comme je vois qu'il a la même colonne de chiffres, mais ne pas montrer les résultats souhaités> je suis un peu nouveau à l'écriture de scripts bash..pls laissez-moi savoir ce que je suis en manque dans ce script. la diff dans les 2 jeux de données est seulement les 2 dernières colonnes de données qui représente la clé des champs avec des valeurs alphanumériques.
Le problème est la largeur de la colonne doit être augmentée (
-W999
) et la suppression regexp besoin de peaufinage. J'ai modifié les deux solutions. Si le csv enregistrement est plus alors 999 caractères, modifier la-W
commutateur en conséquence.Merci beaucoup potong votre réponse m'a vraiment aidé. maintenant, j'ai créé un .sh fichier de script pour obtenir mes fichiers csv en fonction des dates, et de passer les fichiers csv à traiter à l'aide de diff et awk> je l'ai testée avec mon mannequin d'ensembles de données et tout fonctionne bien. Quand j'ai des fichiers csv avec 10000 enregistrements dans chacun des cas, le script agit étrangement. J'ai ajouté 10001 st record pour un csv et exécuté le script et on s'attend à obtenir 1 diff mais j'ai eu 10001 diff. Quand j'ai réduit le nombre d'enregistrements à 9999 dans un csv, j'ai eu la diff 1 comme prévu.
OriginalL'auteur potong
Un bon point de départ serait probablement:
Ce sorties:
Ce qui signifie qu'il a Ajouté un dossier à la ligne 5 (5a) et changé les enregistrements sur les lignes 1 et 3 (1,3 c).
Si vous ne pouvez pas utiliser ce format en tant que-est (ce qui serait bon d'utiliser une norme de), vous devez écrire un script qui convertit le format que vous décrivez.
OriginalL'auteur lnafziger