[Shell]Comparer le contenu de 2 fichiers

Résolu/Fermé
bezourox Messages postés 729 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 19 janvier 2013 - 10 nov. 2010 à 15:56
bezourox Messages postés 729 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.


A voir également:

7 réponses

Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
10 nov. 2010 à 16:32
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).
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 nov. 2010 à 16:34
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
$
0
bezourox Messages postés 729 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 19 janvier 2013 143
10 nov. 2010 à 16:51
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.
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
10 nov. 2010 à 16:58
donc ça doit le faire.
Il y a un problème dans le script de zipe : il n'y a plus CCCCC
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 nov. 2010 à 17:00
Ben si :

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

???
0
bezourox Messages postés 729 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 19 janvier 2013 143
10 nov. 2010 à 17:28
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
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
10 nov. 2010 à 17:47
Tu peux afficher le résultat de la commande :

cat -A fichier
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
15 nov. 2010 à 08:05
test ma solution : tout mettre dans le même fichier, le trier et appliquer uniq.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
15 nov. 2010 à 08:55
Salut Char Snipeur,

C'est ce que fait ma syntaxe, mais ce qui est important c'est surtout qu'il faut rediriger le tout vers le fichier d'origine (fichier_A) et non comme le fait notre ami vers le fichier /home/test/fichier ;-((

D'où le doublon ;-(
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
15 nov. 2010 à 09:18
ok. sort avec plusieurs paramètres, je ne suis pas certain de ce que ça fait, c'est pour ça.
Mais en effet, le problème doit venir de la redirection. Il faut utiliser ">" pour écraser l'ancien fichier et non ">>" qui écrit à la fin.
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 419
15 nov. 2010 à 09:21
Non il ne faut pas écraser d'après sa demande initiale, mais bien concaténer, mais il ne faut pas se tromper de fichier ;-\

Je cite : 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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
bezourox Messages postés 729 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 19 janvier 2013 143
18 nov. 2010 à 11:08
sort -u fich_* > fichier


OK MERCI
0
bezourox Messages postés 729 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 19 janvier 2013 143
29 nov. 2010 à 10:23
Et si maintenant je veux la même fonction, mais sans classement alphabétique ?
0
Char Snipeur Messages postés 9813 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 298
29 nov. 2010 à 10:49
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.
0
bezourox Messages postés 729 Date d'inscription vendredi 30 mars 2007 Statut Membre Dernière intervention 19 janvier 2013 143
1 déc. 2010 à 16:12
Je ne comprends plus rien ...
La commande ne marche plus... elle ne m'élimine pas les doublons...
0