[sed] suppression de ligne consécutive

Résolu
claris -  
 claris -
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
A voir également:

9 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Salut,
Essaie :
sed ':b;$b;N;/^\(.*\)#.*\n\1#.*$/{s/\(.*\)#\(.*\)\n.*/\1#\2/g;bb};$b;P;D'  fichier.txt


Cdt
1
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
T’embête surtout pas à faire des trucs compliqués ! Utilise la commande uniq. Elle fait ça.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Oui sauf que les lignes ne sont pas strictement uniques.
0
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
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
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
Autre solution : uniq a une option pour ne pas comparer les 1ers champs : rev fichier | IFS="#" uniq --option_qui_va | rev
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
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
(Pabix) Messages postés 578 Date d'inscription   Statut Membre Dernière intervention   81
 
mais si, enchaîner rev 2 fois, ça revient à laisser la ligne en état.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 847
 
Oui ça ok, mais j'avais oublié que si deux chaines sont équivalentes, leurs inverses aussi. La fatigue on va dire ^^
0
claris
 
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