[sed] suppression de ligne consécutive

Résolu/Fermé
claris - 10 juil. 2008 à 00:07
 claris - 10 juil. 2008 à 19:50
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 juil. 2008 à 01:22
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
10 juil. 2008 à 08:57
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 juil. 2008 à 09:17
Oui sauf que les lignes ne sont pas strictement uniques.
0
(Pabix) Messages postés 578 Date d'inscription mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
10 juil. 2008 à 09:20
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 juil. 2008 à 09:23
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
10 juil. 2008 à 09:24
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 samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 juil. 2008 à 09:33
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 mercredi 18 mai 2005 Statut Membre Dernière intervention 27 octobre 2009 81
10 juil. 2008 à 11:23
mais si, enchaîner rev 2 fois, ça revient à laisser la ligne en état.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
10 juil. 2008 à 11:26
Oui ça ok, mais j'avais oublié que si deux chaines sont équivalentes, leurs inverses aussi. La fatigue on va dire ^^
0
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