Pb avec la commande comm

Résolu
Bonjour,

J'essaye d'adapter un vieux script pour lequel certain d'entre vous mon beaucoup aidé à le faire.
J'ai un soucis avec la commande comm.

j'ai donc deux fichiers structuré de la même façon (fichier de longueur fixe ou je compare la version de la veille avec celle du jour).

j'utilise la commande comme suit :

comm -3 $SIGACS/file/fich1_REF_Sorted.P $SIGACS/file/fich2_Sorted.P |sed 's/^[ \t]*//'|sort -k 1 > $FICTemp4

le soucis est qu'au lieu d'avoir dans mon fichier final :

mec1;aaaa;bbb;cccc
mec2;aagg;bbs;cco
mec3;aaaa;bbb;cccc
mec4;zagg;qbs;cxo

J'ai un décalage sur le première ligne ( espace à la place des "----" :

--------mec1;aaaa;bbb;cccc
--------mec2;aagg;bbs;cco
mec3;aaaa;bbb;cccc
mec4;zagg;qbs;cxo

quand j'affiche la tabulation j'ai ">>" au début des ligne décalé (en plus petit)
quelqu'un sait à quoi cella pourrait être du ?

Merci à tous d'avance.

5 réponses

  1. Contributeur
    hello
    comm insère une tabulation pour différencier les données qui viennent d'un fichier ou de l'autre
    --output-delimiter="" n'est pas accepté
    1. Bonjour,

      Merci pour ta réponse. ce qui m'étonne c'est que je l'avais déjà utilisée cette commande sans que ça me le fasse comme ça.
      Comment puis-je enlever cet tabulation ?

      Merci.
      1. Contributeur
        Salut,

        Le problème ce n'est pas d'enlever la tabulation, mais de savoir ce que tu veux exactement ?

        Il serait bien de savoir ce que contiennent tes fichiers de départ et ce que tu veux en sortie !

        Si la sortie de la commande "comm" ne te convient pas, c'est peut être que ce n'est pas la commande appropriée à ton traitement ;-\
    2. Bonjour Zipe31,

      Je sais ce que je veux faire et comme je l'ai précisé au début, j'essaye d'adapter un vieux script qui fonctionne très bien et qui faisait exactement ce que je souhaitais à l'époque et ce que j'aimerai faire maintenant.
      Le but de ce script étant de comparer un fichier extrait du jour à celui extrait de la veille. le fichier est un fichier plat de longueur fixe et des séparateurs de champs ";" . je cherche donc à identifier les lignes modifiées ou ajoutée ou retirée. Pour cela la mécanique générale de mon script est apparemment bonne.
      Ce que je constate c'est qu'il ne réagit pas de la même façon et que je dois adapter certaine commande.
      Ce que je souhaite donc c'est qu'il n'y est pas cette tabulation car je dois comparer les lignes entre elles de ce même fichier.
      1. Contributeur
        j'essaye d'adapter un vieux script qui fonctionne très bien et qui faisait exactement ce que je souhaitais à l'époque
        D'où mon interrogation concernant la commande "comm" qui n'est peut être pas la plus appropriée ;-\

        je cherche donc à identifier les lignes modifiées ou ajoutée ou retirée. Pour cela la mécanique générale de mon script est apparemment bonne.
        Celle de l'ancien script ou avec la commande "comm" ?

        Ce que je constate c'est qu'il ne réagit pas de la même façon et que je dois adapter certaine commande.
        Si on pouvait avoir un exemple concret (un bout des 2 fichiers à comparer et la sortie que tu attends), peut être serions-nous plus à même de t'aider ;-\
      2. 1- A priori la commande comm est approprié puisque le script à fonctionné comme souhaité

        2- la mécanique générale de mon script a été faite en utilisant que la commande "comm" avec laquelle j'ai obtenu les résultats souhaités.

        3- le première exemple c'est cette tabulation que je ne n'avais pas avant par exemple.
        c'est également la commande suivante ( la partie en gras) qui ne fonctionne pas aujourd'hui :

        uniq -u --check-chars=7 que j'ai du modifier comme suit uniq -u -f 1

        exemple de fichier :

        fichier 1 (la veille)

        mec1;pepito;rue;CDD
        mec2;toto;avenue;CDI
        mec3;jean;rue;CDD
        mec4;dupont;boulevard;CDD


        fichier 2 (du jour)

        mec1;pepito;rue;CDI
        mec2;toto;avenue;CDI
        mec4;dupont;boulevard;CDD
        mec5;pierre;rue;CDI


        Résultat du script :
        mec1;pepito;rue;CDI => car modifié
        mec3;jean;rue;CDD => car sorti
        mec5;pierre;rue;CDI => car arrivé
      3. Contributeur
        Merci.

        Par contre comment arrives-tu à ce résultat (avec ou sans tabulations) ?
        Parce que j'ai beau essayé toutes les combinaisons possibles avec la commande "comm", je n'obtiens jamais ces trois résultats là ;-\
      4. En faite, mon script ne se résume pas juste au comm car il y a toute une mécanique derrière qui me permet d'arrivée à ce résultat.
        Le comm je l'utilise deux fois puis après c'est de la manipulation de fichiers.

        Dans la parti qui pose problème pour l'instant, mon but est d'isoler les vrai lignes uniques dans chacun des deux fichiers de départ (ligne qui n'apparait que dans seulement l'un ou l'autre des fichiers ).
        Le soucis est qu'une ligne modifié sera considérée comme unique dans chacun des fichiers. Pour ce faire après mon comm, j'utilise la commande uniq sur le premier champs car je sais que c'est un identifiant unique.
        Si dans le fichier que j'essaye de construire on a deux fois ce même identifiant je sais alors que c'est une modification donc je n'en veux pas car ce cas là je le traite ailleurs.
        C'est pour cela qu'il est important que mon fichier ne soit pas fait avec des tabulation en début de ligne mais que toutes mes lignes début au même endroit.

        en espérant avoir été suffisamment clair...
      5. Contributeur
        Pour la suppression des tabulations (en exemple les 2 fichiers donnés plus haut) :
        $ comm -3 f1 f2
        mec1;pepito;rue;CDD
        	mec1;pepito;rue;CDI
        mec3;jean;rue;CDD
        	mec5;pierre;rue;CDI
        
        $ comm -3 f1 f2 | tr -d '\t'
        mec1;pepito;rue;CDD
        mec1;pepito;rue;CDI
        mec3;jean;rue;CDD
        mec5;pierre;rue;CDI

        Mais bon on obtient le même résultat avec :
        $ sort f1 f2 | uniq -u
        mec1;pepito;rue;CDD
        mec1;pepito;rue;CDI
        mec3;jean;rue;CDD
        mec5;pierre;rue;CDI
    3. Contributeur
      Comment puis-je enlever cet tabulation ?
      avec sed comme tu le fais ou
      tr -d '\t'
      1. Excuse moi, je le mets à la place de ce qui est déjà en argument du sed avec mon comm ??

        comm -3 $SIGACS/file/fich1_REF_Sorted.P $SIGACS/file/fich2_Sorted.P |sed 's/^[ \t]*//'|sort -k 1 > $FICTemp4

        comme ça

        comm -3 $SIGACS/file/fich1_REF_Sorted.P $SIGACS/file/fich2_Sorted.P |sed tr -d '\t' |sort -k 1 > $FICTemp4
      2. Contributeur
        non, c'est autre commande, mais le sed va très bien
        comm -3 $SIGACS/file/fich1_REF_Sorted.P $SIGACS/file/fich2_Sorted.P |sed 's/^[ \t]*//'|sort -k 1 > $FICTemp4  
        ou  
        comm -3 $SIGACS/file/fich1_REF_Sorted.P $SIGACS/file/fich2_Sorted.P | tr -d '\t' |sort -k 1 > $FICTemp4 

        le sed ne traite que les tabs en début de ligne, tr va tous les supprimer
      3. Ok.
        je vais le tester car à priori la premier méthode ne marche pas ici ou je suis.

        Merci ;-)
      4. Test effectué mais toujours le décalage... :-(

        merci quand même
    4. MERCI a tous pour vos réponses.

      Voila la seul solution qui a fonctionné :
      $ sort f1 f2 | uniq -u

      De toute façon vu q'il faut que je réhabilite tous mon script vous risquez de me revoir bientôt.. ;-P