IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Comparer deux fichiers texte


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 69
    Points : 34
    Points
    34
    Par défaut Comparer deux fichiers texte
    Bonjour à tous,

    Après plusieurs recherches je ne trouve pas exactement ce que je veux.
    J'ai deux fichiers textes, appelons les 1 et 2. Je voudrais supprimer du fichier 2 les entrées qui sont déjà présente dans 1, sans les concaténer. En gros comparer les deux, et supprimer les entrées qui sont présentes dans 1 et 2 du fichier 2.

    Y aurait-il une commande pour ça ? J'ai regardé diff, cmp, mais je ne trouve rien d'utile. Avec cat je ne vois pas non plus.

    Merci

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    un petit exemple, pour être tout à fait clair ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    Merci pour votre réponse.

    Je me doutais que mon explication manquait de clarté.

    Donc par exemple, un fichier 1.txt contenant :

    bonjour
    aurevoir
    salut
    pourquoi
    hey
    bien

    Et un fichier 2.txt contenant :

    bonjour
    nuage
    ciel
    salut
    pourquoi
    trop
    hey
    bien

    J'aimerais savoir si une commande, ou un assemblage de commandes, pourrait me faire obtenir un fichier 3 contenant les entrées du fichier 2 n'étant pas présentes dans le fichier 3, à savoir pour l'exemple
    Fichier 3.txt :

    nuage
    ciel
    trop


    Voilà, si quelqu'un a une idée
    Merci par avance.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat fic_1
    bonjour
    aurevoir
    salut
    pourquoi
    hey
    bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat fic_2
    bonjour
    nuage
    ciel
    salut
    pourquoi
    trop
    hey
    bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ diff --old-line-format= --unchanged-line-format= --new-line-format=%L fic_*
    nuage
    ciel
    trop
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour,

    ou plus simplement:
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 69
    Points : 34
    Points
    34
    Par défaut
    Merci pour vos réponses

    Effectivement les deux solutions marchent !

    Merci encore.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ganon551 Voir le message
    Effectivement les deux solutions marchent !
    Attention! Les 2 commandes ne sont pas équivalentes et (une fois n'est pas coutume) les spécifications ne sont pas suffisamment précises pour déterminer laquelle est préférable...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat fic_1
    bonjour
    aurevoir
    salut
    pourquoi
    hey
    bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat fic_2
    bonjour
    nuage
    ciel
    salut
    pourquoi
    trop
    hey
    bien
    bonjour
    Notez bien que fic_2 contient à la fin une ligne (bonjour) qui était déjà présente au début dans fic_1 et fic_2, ce qui fait apparaître une différence de comportement entre les 2 commandes!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ diff --old-line-format= --unchanged-line-format= --new-line-format=%L fic_*
    nuage
    ciel
    trop
    bonjour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ grep -v -f fic_1 fic_2
    nuage
    ciel
    trop
    De la même manière avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $ cat fich_1
    bonjour
    aurevoir
    salut
    pourquoi
    hey
    bien
     
    $ cat fich_2
    bien
    hey
    pourquoi
    salut
    aurevoir
    bonjour
     
    $ diff --old-line-format= --unchanged-line-format= --new-line-format=%L fich_*
    hey
    pourquoi
    salut
    aurevoir
    bonjour
     
    $ grep -v -f fich_1 fich_2

  8. #8
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Je voudrais supprimer du fichier 2 les entrées qui sont déjà présente dans 1
    Si tu ne réponds pas à cela, c'est l'échec ("bonjour" toujours présent).
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  9. #9
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    C'est pas faux...

    Sauf que pile poil juste après, le PO dit:
    En gros comparer les deux, et supprimer les entrées qui sont présentes dans 1 et 2 du fichier 2.
    Et, comme il ne précise pas "présentes dans 1 et 2 au même endroit" ni "présentes dans 1 et 2 n'importe où", et que l'exemple fourni ne permet pas de lever l'ambiguïté, je persiste à considérer que les 2 interprétations restent valables.

    Peut-être a-t-il envie de voir le 2ème bonjour de fic2 qui, d'un certain point de vue, peut apparaître comme supplémentaire par rapport au contexte des lignes autour de la 7ème ligne de fic1, malgré sa présence ailleurs dans le fichier.

    Je voulais juste attirer l'attention du PO sur la différence de comportement des 2 solutions.
    S'il a testé les 2 méthodes sur les vrais fichiers et qu'il obtient le même résultat (par exemple, parce que les lignes des fichiers sont toutes différentes), alors pas de souci!

    De toute façon, je remercie cette ambiguïté qui m'a permis de voir la solution de N_Bah qui me semble bien plus pratique pour mettre en forme le résultat d'un "diff" que de passer la sortie traditionnelle du diff par du sed/awk! J'espère la retenir (ou, au moins, retenir qu'elle existe!)!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/10/2012, 01h03
  2. Lire et comparer deux fichiers texte
    Par Ballim dans le forum MATLAB
    Réponses: 6
    Dernier message: 10/10/2008, 08h59
  3. Comparer deux fichiers texte
    Par turbo_chess dans le forum Général Java
    Réponses: 4
    Dernier message: 18/09/2008, 13h23
  4. Comparer deux fichier texte
    Par imsse dans le forum C#
    Réponses: 7
    Dernier message: 29/06/2007, 18h24
  5. Fonction c qui compare deux fichiers ???
    Par babyface dans le forum C
    Réponses: 4
    Dernier message: 19/11/2005, 13h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo