[Shell]Comparer le contenu de 2 fichiers

Résolu
bezourox Messages postés 730 Date d'inscription   Statut Membre Dernière intervention   -  
bezourox Messages postés 730 Date d'inscription   Statut Membre Dernière intervention   -
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

  1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
     
    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
  2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  3. bezourox Messages postés 730 Date d'inscription   Statut Membre Dernière intervention   143
     
    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
    1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      donc ça doit le faire.
      Il y a un problème dans le script de zipe : il n'y a plus CCCCC
      0
    2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Ben si :

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

      ???
      0
  4. bezourox Messages postés 730 Date d'inscription   Statut Membre Dernière intervention   143
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      Tu peux afficher le résultat de la commande :

      cat -A fichier
      0
    2. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      test ma solution : tout mettre dans le même fichier, le trier et appliquer uniq.
      0
    3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
    4. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      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
    5. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. bezourox Messages postés 730 Date d'inscription   Statut Membre Dernière intervention   143
     
    sort -u fich_* > fichier

    OK MERCI
    0
  7. bezourox Messages postés 730 Date d'inscription   Statut Membre Dernière intervention   143
     
    Et si maintenant je veux la même fonction, mais sans classement alphabétique ?
    0
    1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      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
  8. bezourox Messages postés 730 Date d'inscription   Statut Membre Dernière intervention   143
     
    Je ne comprends plus rien ...
    La commande ne marche plus... elle ne m'élimine pas les doublons...
    0