Forum Programmation.shell différences entre 2 fichiers

Posté par  .
Étiquettes : aucune
0
15
déc.
2007
J'aimerais réaliser ceci à l'aide d'un script shell :

Je dispose de 2 fichiers A et B, et je souhaite trouver toutes les lignes de A qui ne sont pas dans B, puis toutes les lignes de B qui ne sont pas dans A.

J'ai essayé avec la commande diff, mais elle nécessite que les 2 fichiers soit triés de façon semblables, or ce n'est pas le cas. Ils sont déjà triés (mais différemment) et je voudrais éviter d'en faire des copies pour les retrier avec 'sort' puis ensuite faire un diff.

En gros :
fichier A
1
2
4
A
S

Fichier B
4
S
X
3
2
1

Je voudrais obtenir "A" d'abord (lignes de A qui ne sont pas dans B) puis "X" et "3" (lignes de B qui ne sont pas dans A)

Merci d'avance.
  • # programmation...

    Posté par  . Évalué à 1.

    voici un algo qui ferait ce que tu veux

    ----------
    ouvrir A
    pour chaque ligne de A, chercher si on trouve la meme dans B
    si non_trouve => ecrire la ligne dans C
    puis
    ouvrir B
    pour chaque ligne de B, chercher si on trouve la meme dans A
    si non_trouve => ecrire la ligne dans C
    ----------

    ensuite y a plus qu'a regarder dans C
  • # moreutils

    Posté par  (site web personnel) . Évalué à 2.

    combine f1 not f2
    combine f2 not f1

    http://packages.debian.org/unstable/utils/moreutils
  • # comm est la commande qu'il te faut

    Posté par  . Évalué à -1.


    COMM(1) NetBSD General Commands Manual COMM(1)

    NAME
    comm -- select or reject lines common to two files

    SYNOPSIS
    comm [-123f] file1 file2

    DESCRIPTION
    The comm utility reads file1 and file2, which should be sorted lexically,
    and produces three text columns as output: lines only in file1; lines
    only in file2; and lines in both files.

    The filename ``-'' means the standard input.

    The following options are available:

    -1 Suppress printing of column 1.

    -2 Suppress printing of column 2.

    -3 Suppress printing of column 3.



    Pour que ca marche, il faut que les fichiers soient triés.

    droopy# cat A
    1
    2
    4
    A
    S

    droopy# cat B
    4
    S
    X
    3
    2
    1droopy# sort A >A.sorted
    droopy# cat ./A.sorted
    1
    2
    4
    A
    S
    droopy# sort B >B.sorted
    droopy# cat ./B.sorted
    1
    2
    3
    4
    S
    X

    droopy# comm -13 ./A.sorted ./B.sorted
    3
    X

    droopy# comm -23 ./A.sorted ./B.sorted
    A
    • [^] # Re: comm est la commande qu'il te faut

      Posté par  . Évalué à 1.

      -1
      car ca ne repond pas à l'enoncé

      [...]et je voudrais éviter d'en faire des copies pour les retrier avec 'sort' puis ensuite faire un diff.


      et que c'est exactement ce que tu fais sauf que tu n'utilises pas diff mais comm
      • [^] # Re: comm est la commande qu'il te faut

        Posté par  . Évalué à 2.

        OUPS! Désolé, j'avais pas fait attention à ce détail. Voilà ce qui se passe quand on veut aller trop vite.

        Bon pour la peine je vais écrire 100 fois "il faut bien lire l'énoncé d'un problème avant de le résoudre"
  • # Avec un bon shell

    Posté par  . Évalué à 2.

    diff -u <(sort fichier1) <(sort fichier2)

    J'ai cru un moment que seul zsh le faisait, mais j'avais largement sous-estimé bash qui en fait autant.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.