[sed] suppression de ligne consécutive

Résolu
Bonjour,

Je souhaiterai supprimer des lignes identiques et consécutives dans un fichier texte avec sed.

le fichier ressemble à ceci :

z01105:6649#file0
z01105:6649#file1
z01105:6649#file1
z01105:6649#file1
z01105:6649#file1
e0117:10001#file0
e0117:10001#file1
p10186:10002#file0
p10186:10002#file1
p10186:10003#file1
n119160:808#file0
n119160:808#file1
z11192:29#file0
z11192:29#file1


je connais la commande suivante

sed "$!N; /^\(.*\)\n\1$/!P; D" fichier.txt


je m'acharne dessus depuis toute l'après-midi, mais je n'arrive pas à la modifier de sorte à ce que le fichier en sortie donne :

z01105:6649#file0

e0117:10001#file0

p10186:10002#file0

p10186:10003#file1
n119160:808#file0

z11192:29#file0



En fait, il faut que la comparaison se face sur la chaine située avant le signe "#".

merci d'avance pour votre aide

Claris
Configuration: Windows XP
Firefox 2.0.0.15

9 réponses

  1. Contributeur
    Salut,
    Essaie :
    sed ':b;$b;N;/^\(.*\)#.*\n\1#.*$/{s/\(.*\)#\(.*\)\n.*/\1#\2/g;bb};$b;P;D'  fichier.txt


    Cdt
    1
    1. T’embête surtout pas à faire des trucs compliqués ! Utilise la commande uniq. Elle fait ça.
      0
      1. Contributeur
        Oui sauf que les lignes ne sont pas strictement uniques.
        0
    2. J’avais en effet pas vu ça. Est-ce que ce qui est derrière le # est important ? Sinon tu peux filtrer : awk 'BEGIN{ FS="#" } {print $1}' fichier | uniq ?
      0
      1. Contributeur
        Bah il a dit que c'est ce qu'il voulait dans sa sortie. Faudrait lui demander. Mais bon sinon un simple :
        less fichier | cut -d'#' -f1 | uniq est ok. Mais bon ma commande sed marche et est parfaitement compréhensible non ? loool.
        0
        1. Autre solution : uniq a une option pour ne pas comparer les 1ers champs : rev fichier | IFS="#" uniq --option_qui_va | rev
          0
          1. Contributeur
            Tu parles sûrement d'uniq -f1 oui c'est une bonne idée. Sauf que rev inverse caractères par caractères. Donc ta solution ne marchera pas.
            0
            1. mais si, enchaîner rev 2 fois, ça revient à laisser la ligne en état.
              0
              1. Contributeur
                Oui ça ok, mais j'avais oublié que si deux chaines sont équivalentes, leurs inverses aussi. La fatigue on va dire ^^
                0
                1. Super,

                  Ça marche nickel !!!

                  Je vous remercie infiniment tous les deux en en particulier fiddy

                  Cela-dit, si une petite explication pouvait accompagner la syntaxe tant recherchée ce serait un plus, histoire de comprendre un peu. Parce que dès qu'il s'agit de manipuler le cache je me perds, même avec comme support le tutoriel sed disponible sur ccm.

                  Encore merci
                  0