#1 Le 27/11/2021, à 20:21
- Sciensous
sed pour éliminer lignes multiples [RÉSOLU]
hello, j'ai trouvé sur le net une commande utilisant sed qui permettrait de supprimer 2 lignes consécutives d'un fichier:
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P'
or je teste avec un fichier test contenant :
zz
aa
bb
cc
aa
dd
ee
et
sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' test
retourne le fichier sans supprimer le aa en double
Quelqu'un saurait le pourquoi du comment ?
merci
Dernière modification par Sciensous (Le 28/11/2021, à 10:45)
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#2 Le 28/11/2021, à 00:35
- nany
Re : sed pour éliminer lignes multiples [RÉSOLU]
Bonjour,
Si on exécute
sed --debug -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' test
on voit que la commande /^\([ -~]*\n\).*\n\1/d ne donne rien. Voilà déjà le pourquoi. Quant au comment, je cherche encore car je n’arrive pas à comprendre cette commande (le d je vois bien mais c’est le pattern qui me trouble).
En revanche, en cherchant où tu avais bien pu trouver cette ligne sed, j’ai trouvé une commande awk qui marche du feu de dieu et qui m’a fait découvrir seen :
awk '!seen[$0]++' test
Hors ligne
#3 Le 28/11/2021, à 00:46
- nany
Re : sed pour éliminer lignes multiples [RÉSOLU]
je n’arrive pas à comprendre cette commande (le d je vois bien mais c’est le pattern qui me trouble).
Si on remplace [ -~] par un point ça fonctionne :
sed -n 'G; s/\n/&&/; /^\(.*\n\).*\n\1/d; s/\n//; h; P' test
C’est donc bien cette partie ([ -~]) que je n’ai pas comprise qui est la fautive.
Hors ligne
#4 Le 28/11/2021, à 01:13
- nany
Re : sed pour éliminer lignes multiples [RÉSOLU]
cette partie ([ -~]) que je n’ai pas comprise
C’est tout simple en fait :
Ça cherche tout caractère entre l’espace et le tilde (je cherchais une interprétation du tilde alors qu’il n’y en avait pas).
Mais du coup je ne vois pas pourquoi ça ne supprime pas la ligne.
Hors ligne
#5 Le 28/11/2021, à 10:28
- Sciensous
Re : sed pour éliminer lignes multiples [RÉSOLU]
merci (super)Nany, je vais essayer et je mettrai le retour positif (j'espère) ou non
pour les détails, j'avais trouvé ça mais ça ne m'avait pas aidé
édit: oui avec ~ ou } ça bugue; pas avec z à la place de ~
j'avais essayé avec * directement mais pas avec .*
donc résolu pour moi mais pas pour le net
Dernière modification par Sciensous (Le 28/11/2021, à 10:45)
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#6 Le 28/11/2021, à 20:08
- kamaris
Re : sed pour éliminer lignes multiples [RÉSOLU]
En revanche, en cherchant où tu avais bien pu trouver cette ligne sed, j’ai trouvé une commande awk qui marche du feu de dieu et qui m’a fait découvrir seen :
awk '!seen[$0]++' test
seen est juste le nom de la variable tableau
On trouve aussi souvent a pour « array » :
awk '!a[$0]++' test
Sinon chez moi la commande de départ fonctionne avec le cas de test donné, c'est bizarre.
Je suis en LANG=fr_FR.UTF-8, mais je suppose que vous aussi.
Hors ligne
#7 Le 28/11/2021, à 20:45
- Sciensous
Re : sed pour éliminer lignes multiples [RÉSOLU]
@ kamaris: je te confirme que j'ai le même LANG
par contre j'ai LANGUAGE=fr_FR:fr_CA (pourquoi CAnadien ?)
j'avais vu aussi cette commande awk tantôt avec seen tantôt avec x donc ne comprenant rien j'ai laissé tomber. Maintenant je suis moins bête
merci à vous 2
antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )
Hors ligne
#8 Le 28/11/2021, à 20:51
- kamaris
Re : sed pour éliminer lignes multiples [RÉSOLU]
Au cas où, peux-tu essayer
LC_ALL=C sed -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' test
?
Hors ligne