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

Messages postés
733
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
- - Dernière réponse : bezourox
Messages postés
733
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
- 1 déc. 2010 à 16:12
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.


Afficher la suite 

7 réponses

Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
1098
0
Merci
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
37470
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
21 novembre 2019
4228
0
Merci
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
733
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
137
0
Merci
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.
Char Snipeur
Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
1098 -
donc ça doit le faire.
Il y a un problème dans le script de zipe : il n'y a plus CCCCC
zipe31
Messages postés
37470
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
21 novembre 2019
4228 -
Ben si :

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

???
Messages postés
733
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
137
0
Merci
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
zipe31
Messages postés
37470
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
21 novembre 2019
4228 -
En fin de compte un :

sort -u A B C

Devrait suffire ;-))
bezourox
Messages postés
733
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
137 -
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 :)
zipe31
Messages postés
37470
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
21 novembre 2019
4228 -
$ 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 ?
bezourox
Messages postés
733
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
137 -
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
Char Snipeur
Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
1098 -
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
733
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
137
0
Merci
sort -u fich_* > fichier


OK MERCI
Messages postés
733
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
137
0
Merci
Et si maintenant je veux la même fonction, mais sans classement alphabétique ?
Char Snipeur
Messages postés
9713
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
13 septembre 2019
1098 -
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
733
Date d'inscription
vendredi 30 mars 2007
Statut
Membre
Dernière intervention
19 janvier 2013
137
0
Merci
Je ne comprends plus rien ...
La commande ne marche plus... elle ne m'élimine pas les doublons...