Comparaison deux fichiers.

Résolu/Fermé
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024 - Modifié le 14 sept. 2021 à 16:08
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 - 16 sept. 2021 à 12:04
Bonjour,

Un fichier est généré toutes les heures avec 2000 lignes (limit max).
Chaque heure, le nouveau fichier contient une partie des lignes du fichier généré l'heure précédente + des nouvelles lignes.

Chaque heure, à la fin du traitement, j'aimerais avoir un fichier qui ne contient aucun doublon, soit les lignes des heures précédentes + uniquement les nouvelles du nouveau fichier.

mon idée:

comm -3 FIC(H-1)  FICH > FIC.com
cat FIC.com >>  FIC(H-1)


Il y a mieux?

Merci.


Configuration: Windows / Chrome 92.0.4515.131
A voir également:

2 réponses

mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
Modifié le 15 sept. 2021 à 11:46
Bonjour

Vu les contraintes imposées par ton API, il semble effectivement compliqué d'envisager un logger. Du coup, ta solution basée sur
comm
me paraît très bienà condition que les lignes soient ordonnées. Autrement
comm
peut ne pas marcher comme le montre cet exemple :

(mando@silk) (~) $ cat fichier1 
1 a
3 c
2 b
(mando@silk) (~) $ cat fichier2
2 b
1 A
(mando@silk) (~) $ comm -3 fichier1 fichier2
1 a
2 b
comm: le fichier 2 n'est pas dans l'ordre trié
1 A
3 c
comm: le fichier 1 n'est pas dans l'ordre trié
2 b
comm: l'entrée n'est pas dans l'ordre trié


Or vu le format de tes fichiers, il n'est pas évident que tes fichiers soient triés.

En tout cas, si tu observes un problème lié à ça, tu pourrais te rabattre du
diff
pour extraire les lignes apparues dans le dernier fichier (ce sont celles qui commenceront par +).

diff --new-line-format="%L" --old-line-format="" --unchanged-line-format="" fichier1 fichier2


Pour plus de détails ou voir d'autres approches, voir cette discussion.

Bonne chance
1
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
15 sept. 2021 à 16:41
Merci. En modifiant l'ordre de champs et avec un sort -n, j'ai finalement réussi à obtenir ce que je veux.

Merci pour votre aide.
0
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749 > bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
16 sept. 2021 à 12:04
Merci pour ton retour, bonne continuation
0
mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
14 sept. 2021 à 16:07
Bonjour,

Il faudrait clarifier avec un petit exemple pour être sûr de comprendre ton problème.

Si j'ai bien compris tu as un buffer de 2000 lignes dont tu fais un dump toutes les heures de ce buffer, et tu veux à partir de ces dumps, reconstruire l'ensemble des lignes qui ont engendrées ces photos.

Ensuite, le fait que tu utilises comm laisse supposer que tes fichiers sont triés (e.g. parce que les lignes sont horodatées) -- je suppose qu'il s'agit d'une sorte de log.

Si c'est bien ça,
comm
me paraît très bien, car contrairement à
diff
, il va exploiter le fait que tes fichiers sont triés (e.g. parce que les lignes sont horodatées, comme dans un log) et sera donc plus rapide que
diff
.

Après la question c'est est ce que le problème ne devrait pas être traité en amont, c'est-à-dire, au lieu de faire un dump périodique, ne faudrait-il pas plutôt que l'outil qui génère ses lignes utilise un logger (e.g.
rsyslog
) pour avoir un unique fichier mis à jour en temps réel.

Bonne chance
0
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
Modifié le 15 sept. 2021 à 11:33
Bonjour et merci pour la réponse.

Non, je ne peux pas traiter en amont car l'API qui génère le fichier est limité à 1000 lignes. Chaque ligne correspond à 1 backup de 1 serveur.
J'ai l'impression que le sort avant le comm pose problème.

Exemple de résultat sur 1 ligne (très longue):
cluster00,VEGA,SuccessfulWithWarnings,Backup,VirtualMachine:::a5d0fb55-4c5a-4734-96e3-c6cc3349c820-vm-95635,VmwareVirtualMachine,swucfraej949,sapifrfx1vc03.fr.intranet,SLA_UAT,2021-09-15T04:06:30.386Z,2021-09-15T04:09:54.849Z,2021-09-14T04:03:35.096Z,2021-09-16T04:00:00.000Z,false,LOCAL,0,1479737344,85899345920,20294282,204463,RVMHM193S001062,0,false,15,2021-03-19T19:48:56.931Z,vm-95635,sepifrfx11538.fr.intranet,SIR-WIN-INF-HP,poweredOn,2021-03-19T19:48:56.931Z,100.83.192.202,Unregistered,Microsoft Windows Server 2016 or later (64-bit),false,true,false,FAILED,sapifrfx1vc03.fr.intranet/SIRIUS/vm/VM_CLOUD/Windows,sapifrfx1vc03.fr.intranet/SIRIUS/SIR-WIN-INF-HP/sepifrfx11538.fr.intranet

cluster00,VEGA,SuccessfulWithWarnings,Backup,VirtualMachine:::a5d0fb55-4c5a-4734-96e3-c6cc3349c820-vm-95637,VmwareVirtualMachine,swucfraej172,sapifrfx1vc03.fr.intranet,SLA_UAT,2021-09-15T04:12:44.632Z,2021-09-15T04:15:26.143Z,2021-09-14T04:10:01.633Z,2021-09-16T04:00:00.000Z,false,LOCAL,0,1527316480,85899345920,25379558,161511,RVMHM193S000910,0,false,15,2021-03-19T19:47:17.363Z,vm-95637,sepifrfx10203.fr.intranet,VEG-WIN-INF-HP,poweredOn,2021-03-19T19:47:17.363Z,100.83.240.190,Unregistered,Microsoft Windows Server 2016 or later (64-bit),false,true,false,FAILED,sapifrfx1vc03.fr.intranet/VEGA/vm/VM_CLOUD/Windows,sapifrfx1vc03.fr.intranet/VEGA/VEG-WIN-INF-HP/sepifrfx10203.fr.intranet


Merci.
0