|
|
|
|
Bonjour à tous,
Une seule chose à dire, à l'aiiiiiiidddddddddeeeeeeeeeeuuuuuu,
plaisanterie mise a part, voila ce sur quoi je bloque depuis quelques jours, j'ai un fichier unix qui contient des lignes successives identiques et ce plusieurs fois dans le fichier, comme par exemple :
[bloc1]
AA
BB
CC
DD
DD
[bloc2]
EE
FF
DD
[bloc3]
GG
HH
II
DD
DD
Mon but est de supprimer toutes les lignes identiques successives de manière à trouver en sortie un fichier du type :
[bloc1]
AA
BB
CC
DD
[bloc2]
EE
FF
DD
[bloc3]
GG
HH
II
DD
D'avance merci pour votre support,
Cdlt.
Configuration: sun solaris 10
Merci pour ta réactivité mais je vais préciser encore un point qui risque de compliquer les choses, à savoir que dans ce fameux fichier, j'ai d autres lignes identiques que je ne souhaite pas supprimer or la commande uniq supprime TOUS les doublons (enfin il me semble) et je ne cherche qu'à supprimer en doublon en particulier, typiquement cela donne a peu près ça :
|
Je n'ai rien inventé, c'est juste une adaptation de la syntaxe trouvée dans "info sed" qui émule la fonction "uniq"...(j'ai rajouté quelques doublons au cas ou) [tmpfs]$ cat plop
[bloc1]
AA
BB
CC
CC
DD
DD
DD
[bloc2]
EE
AA
FF
FF
DD
[bloc3]
GG
HH
HH
BB
II
CC
DD
DD
DD
[tmpfs]$ sed 'h;:z;$b;N;/\(DD\)\n\1$/{g;bz};$b;P;D' plop
[bloc1]
AA
BB
CC
CC
DD
[bloc2]
EE
AA
FF
FF
DD
[bloc3]
GG
HH
HH
BB
II
CC
DD
[tmpfs]$ ;-))
JP - Éleveur de pingouins - Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
|
Label too long: h;:z;$b;N;/\(DD\)\n\1$/{g;bz};$b;P;D
h # mettre le contenu de l'espace de travail dans la mémoire annexe
:z # étiquette (label)
$ b # si la dernière ligne est atteinte, se brancher à la fin du script
N # ajouter la ligne suivante dans l'espace de travail
/\(DD\)\n\1$/ { # si l'espace de travail ressemble comme 2 gouttes d'eau à
#+ DD suivi d'un saut de ligne (\n) et suivi par DD (\1) est en fait la
#++ représentation de la 1ère sous-expression (\...\)
g # l'écraser en remettant le contenu de la mémoire annexe
b z # se brancher à l'étiquette "z"
} # fin du groupement de commande
$ b # si la dernière ligne est atteinte, se brancher à la fin du script
P # envoyer sur la sortie standard le contenu de l'espace de travail
#+ compris entre le début et le premier caractère représentant
#++ un saut de ligne (\n)
D # effacer le contenu de l'espace de travail
#+ compris entre le début et le premier caractère représentant
#++ un saut de ligne (\n)
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot. |
Merci gogole ;-))
|