rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Non résolu

Comparaison ligne à ligne dans fichier unix

lestat2008, le jeudi 3 avril 2008 à 17:33:47
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
Répondre à lestat2008  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le jeudi 3 avril 2008 à 17:46:03
Salut,
[tmpfs]$ cat plop
[bloc1]
AA
BB
CC
DD
DD
[bloc2]
EE
FF
DD
[bloc3]
GG
HH
II
DD
DD
[tmpfs]$ uniq plop
[bloc1]
AA
BB
CC
DD
[bloc2]
EE
FF
DD
[bloc3]
GG
HH
II
DD
[tmpfs]$
;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lestat2008, le jeudi 3 avril 2008 à 17:55:29
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 :

[bloc1]
AA
BB
CC
DD
DD
[bloc2]
EE
AA
FF
DD
[bloc3]
GG
HH
BB
II
CC
DD
DD

donc pour être plus précis, je ne cherche qu'à supprimer les doublons du type DD et non pas tous les autres qui peuvent apparaitrent, j'espère avoir été suffisament explicite cette fois-ci, désolé.

Merci d'avance.
Répondre à lestat2008

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le jeudi 3 avril 2008 à 20:27:57
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.
Répondre à jipicy

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lestat2008, le vendredi 4 avril 2008 à 14:46:08
Merci pour ta réponse mais lorsque j'éxécute la commande, j'ai le retour suivant :

$sed 'h;:z;$b;N;/\(DD\)\n\1$/{g;bz};$b;P;D' test.txt > test2.txt
Label too long: h;:z;$b;N;/\(DD\)\n\1$/{g;bz};$b;P;D

de plus, pourrais-tu développer le contenu de la commande ?

je sais, je suis chiant mais j'aime comprendre ce que je fais :P pour ne plus avoir à redemander après ;)

D'avance, merci.
Répondre à lestat2008

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le vendredi 4 avril 2008 à 15:02:19
Label too long: h;:z;$b;N;/\(DD\)\n\1$/{g;bz};$b;P;D
Ça c'est bizarre dans la mesure ou le label (étiquette) ne contient qu'une lettre (z) ;-\
Quelle version de "sed" ?

Concernant les explications, tu peux les trouver dans le "info sed" (si les pages infos sont installées sur ton système), sinon ça s'explique comme ça :
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.
Répondre à jipicy

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lestat2008, le mardi 8 avril 2008 à 08:43:11
bonne question pour la version de sed et comment l'obtiens tu ? sachant que la commande sed --version ne fonctionne pas sur mon serveur solaris :(
Répondre à lestat2008

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le mardi 8 avril 2008 à 09:12:33
Essaie de taper "sed" tout seul sur la ligne de commande, normalement une aide devrait être affichée...
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
lestat2008, le mardi 8 avril 2008 à 10:00:49
marche po :'( est ce que tu penses qu'en essayant avec une distribution linux recente comme la ubuntu 7.10, j'aurai plus de chance d'obtenir le résultat escompté ?
Répondre à lestat2008

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le mardi 8 avril 2008 à 10:03:50
Ben oui ;-))

En dernier recours pour la version essaye :
strings /bin/sed | grep -i ver
en remplaçant "/bin/sed" par le bon chemin sur ton système...
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le mardi 8 avril 2008 à 10:07:11
Merci gogole ;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 lestat2008, le mardi 8 avril 2008 à 10:19:47
lol, bon malheureusement je n'ai pas de serveur linux a disposition ce matin mais je testerai cet apres midi, encore merci pour ton aide :)
Répondre à lestat2008
Logiciels pertinents trouvés dans les téléchargements
Télécharger SyncBack 3.2.19.0SyncBack - SyncBack est un logiciel de synchronisation de répertoires. Il peut être utilisé: pour effectuer des backups de fichiers...Catégorie: Sauvegarde
Licence: Freeware/gratuit
Télécharger PSPad 4.5.2PSPad - PSPad est un excellent éditeur de texte. Il est utile pour travailler sur du simple texte, mais aussi sur du HTML, CSS,...Catégorie: Développement
Licence: Freeware/gratuit
Télécharger TextWrangler 2.2.1TextWrangler - TextWrangler est un éditeur de texte évolué. Il propose de nombreuses fonctionnalités : recherche/remplacement...Catégorie: Traitement de texte
Licence: Freeware/gratuit
Télécharger Ant Renamer 2.10.0Ant Renamer - ANT Renamer permet de renommer un grand nombre de fichiers et dossiers en quelques clics. Il ne fait que modifier les noms...Catégorie: Gestion de fichiers
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « comparaison ligne à ligne dans fichier unix »