[Shell]Comparer le contenu de 2 fichiers [Résolu/Fermé]

Signaler
Messages postés
729
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
-
Messages postés
729
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
-
Bonjour,

Voila je veux mettre à jour le contenu d'un fichier à partir de 2 autres.
On part sur l'exemple suivant :

FichierA / FichierB / FichierC

1. Je veux que mon script lise le fichierB ligne par ligne et les compare avec les lignes du FichierA
> Si la ligne existe dans FIchierA ALORS on passe à la ligne suivante
> Sinon on rajoute la ligne à la fin du fichier

2. Meme chose entre FichierC et FichierA

A la fin, le fichierA doit contenu ses propres lignes d'origine + toutes les lignes trouvées dans les FichiersB et FichierC qu'il ne possédait pas.


7 réponses

Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 205
Salut.
Tu ne nous dit pas quel environnement de script tu veux utiliser.
moins, je ferai (en bash) :
cat fichierB fichierC>>fichierA
sort fichierA|uniq>fichierA

Ce n'est pas ton algorithme, mais le résultat sera à peu près le même.
Il faudrait pour nous aider, les contraintes que tu as et pourquoi tu veux faire ça (ton but final quoi).
Messages postés
35766
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
13 novembre 2020
5 629
Salut,

$ cat A
AAAAA                     
BBBBB                     
DDDDD                     
FFFFF                     
GGGGG                     
JJJJJ                     
OOOOO                     
$ cat B
AAAAA                     
BBBBB                     
CCCCC                     
DDDDD                     
FFFFF                     
GGGGG                     
HHHHH                     
JJJJJ                     
KKKKK                     
OOOOO                     
$ cat C
AAAAA                     
BBBBB                     
DDDDD                     
EEEEE                     
FFFFF
GGGGG
IIIII
JJJJJ
LLLLL
MMMMM
NNNNN
OOOOO
$ sort A B C | uniq -u >> A
$ cat A
AAAAA
BBBBB
DDDDD
FFFFF
GGGGG
JJJJJ
OOOOO
CCCCC
EEEEE
HHHHH
IIIII
KKKKK
LLLLL
MMMMM
NNNNN
$
Messages postés
729
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
142
OK merci pour vos réponses.
Je vais faire un test mais c'est exactement ce que je veux faire.
En bref sur différents sites j'ai un gestionnaire qui possède un fichier texte.
Il rajoute dans ce fichier les URL pour lesquelles il souhaite un accès (proxy) avec une URL par ligne.

Le but est que chaque site puisse mette à jour son fichier, le soir lance mon script de synchro, et que je me retrouve sur mon site principal avec la liste complète des URL pour lesquelles je dois ouvrir l'accès.

Voila le but final.
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 205
donc ça doit le faire.
Il y a un problème dans le script de zipe : il n'y a plus CCCCC
Messages postés
35766
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
13 novembre 2020
5 629
Ben si :

$ cat A
AAAAA
BBBBB
DDDDD
FFFFF
GGGGG
JJJJJ
OOOOO
CCCCC
EEEEE
HHHHH
IIIII
KKKKK
LLLLL
MMMMM
NNNNN

???
Messages postés
729
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
142
sort /home/test/fichier_A /home/test/fichier_B /home/test/fichier | uniq -u >> /home/test/fichier

Ce script ne marche pas tout à fait car je retrouve 2 fois une URL (la première de "fichier"

debian:/home/test# ls
fichier fichier_A fichier_B maj_fichier.sh
debian:/home/test# cat fichier_A
test.fr
test.com
debian:/home/test# cat fichier_B
coucou.fr
salut.gm
debian:/home/test# cat fichier
bonjour.fr
coucou.fr
debian:/home/test# ./maj_fichier.sh
debian:/home/test# cat fichier
bonjour.fr
coucou.fr
bonjour.fr
salut.gm
test.com
test.fr
Messages postés
35766
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
13 novembre 2020
5 629
En fin de compte un :

sort -u A B C

Devrait suffire ;-))
Messages postés
729
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
142
je vais essayer car j'ai parlé trop vite :)

sort A B C|uniq >A

Cette commande écrit le contenu de fichierB et fichierC dans fichierA mais supprime les lignes initiales du fichierA :)
Messages postés
35766
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
13 novembre 2020
5 629
$ cat fich_A
test.fr
test.com

$ cat fich_B
coucou.fr
salut.gm

$ cat fich_C
bonjour.fr
coucou.fr

$ sort -u fich_*
bonjour.fr
coucou.fr
salut.gm
test.com
test.fr

C'est bon comme résultat ou pas ?
Messages postés
729
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
142
Voila un résultat qui me convient :)
Toutes les lignes sont présentes à la fin sans aucun doublon.
Il ne reste plus qu'à rediriger le résultat dans fich_A
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 205
Cette commande écrit le contenu de fichierB et fichierC dans fichierA mais supprime les lignes initiales du fichierA :)
je ne comprends pas comment... En fait, tu as des résultats étrange. Il y a peut être un problème avec l'indirection. Essai : (je ne peux pas tester, je ne reproduit pas l'erreur)
sort A B C|uniq>D
mv -f D A

ou alors c'est le "sort" qui merde avec des adresses internet ? Pour debuguer, il faut regarder tout les fichier intermédiares.
Messages postés
729
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
142
sort -u fich_* > fichier


OK MERCI
Messages postés
729
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
142
Et si maintenant je veux la même fonction, mais sans classement alphabétique ?
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 205
Alors là, c'est une autre pair de manche !
Depuis le début nous sommes partie sur le fait que le tri ne te gènait pas. Si maintenant il faut ne plus trier, ça change tout l'algorithme (ça le complexifie beaucoup)
à ce moment là, pour chaque ligne de B et C, il faut vérifier s'il y a la même dans A et l'ajouter à la fin si ce n'est pas le cas. Le plus dur là dedans c'est de comparer une ligne à chaque ligne.
Messages postés
729
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
142
Je ne comprends plus rien ...
La commande ne marche plus... elle ne m'élimine pas les doublons...