[AWK/SED] Supprimer lignes en double [Résolu/Fermé]

JC - 23 mai 2008 à 10:10 - Dernière réponse :  yomanyo
- 21 mai 2010 à 02:33
Bonjour,

je souhaite n'afficher qu'une seule fois les lignes d'un fichier qui apparaissent une ou plusieurs fois.

Je pense que c'est faisable avec AWK ou SED mais je ne vois pas comment...

merci à tous!
Afficher la suite 

10 réponses

dubcek 17178 Messages postés lundi 15 janvier 2007Date d'inscriptionContributeurStatut 10 décembre 2017 Dernière intervention - 23 mai 2008 à 11:54
+14
Utile
4
hello avec awk:
awk '{if (x[$0] != "") next ; print $0 ; x[$0]=$0}' < fichier.txt 
Cette réponse vous a-t-elle aidé ?  
et si les lignes en question doivent rester en état (pas de tri possible) ! faut il faire une boucle ?
DeviantKarot > fabien.dz - 19 mars 2009 à 19:38
Une solution un peu alambiquée :
- numéroter les lignes (cat -n)
- trier les lignes sans prendre en compte le premier champ -le numéro de ligne- (sort -k2)
- ne garder qu'un seul exemplaire des lignes triées, toujours sans prendre en compte le premier champ (uniq -f 1)
- réarranger les lignes dans l'ordre initial en triant par numéro de ligne (sort -n -k1,1)
- et enfin, supprimer les numéros de lignes (cut -d' ' -f2-) (ou avec sed si jamais des tas d'espaces ont été ajoutés avant le numéro de ligne)

Sauf erreur de ma part, en pipant tout ça, ça devrait aller, si ce n'est que ce ne sera pas forcément la première occurence des doublons qui sera conservée (et maintenant que j'en suis là, je me rends compte que ça casse tout ^^ )
Stéphane Ascoët > DeviantKarot - 23 mars 2009 à 08:27
Mettre le numéro de ligne comme deuxième champ de tri lors du premier "sort -k2" serait peut-être la solution?
Un petit script bash pour supprimer les lignes en doubles d'un fichier sans changer la position des autres. Seule la première occurence est conservée.

FICHIER=adressedufichier
DOUBLONS="$(cat $FICHIER | sort | uniq -d)"
if [ "$DOUBLONS" != "" ]; then
for line in $(seq 1 $(echo "$DOUBLONS" | wc -l)); do
TXTASUPPRIMER=$(echo "$DOUBLONS" | sed $line!d)
LIGNESASUPPRIMER=$(grep -n "$TXTASUPPRIMER" $FICHIER | sed -e 1d -e 's/\([0-9]*\):.*/-e \1d/')
sed $LIGNESASUPPRIMER -i $FICHIER
done
fi
asevere 13080 Messages postés lundi 28 janvier 2002Date d'inscriptionModérateurStatut 13 juillet 2017 Dernière intervention - 23 mars 2009 à 09:54
+9
Utile
Une autre solution peut-être:
sort -u test|xargs -I line -L1 grep -m1 "^line$" test
Attention, les commutateur pour xargs sont ceux d'OS X, a adapter pour linux (a priori, -i line ou -i tout seul et une paire d'accollade {})

Ca trie le fichier en ne conservant qu'une occurence de chaque chaine, puis ça cherche la première chaine complête identique dans le fichier...

A plus
jipicy 43485 Messages postés jeudi 28 août 2003Date d'inscriptionModérateurStatut 7 novembre 2010 Dernière intervention - 23 mai 2008 à 10:13
+3
Utile
Salut,

Et pourquoi pas avec "sort -u" tout simplement ? A moins qu'il ne faille pas trier le fichier avant ?
+1
Utile
j'ai trouvé ça marche avec sort -u

mais ça doit etre possible avec awk
Stéphane Ascoët - 23 mai 2008 à 10:53
0
Utile
1
Pourquoi ne pas essayer avec tr -d ?
jipicy 43485 Messages postés jeudi 28 août 2003Date d'inscriptionModérateurStatut 7 novembre 2010 Dernière intervention - 23 mai 2008 à 11:02
Parce que "tr" n'est pas fait pour ça...
tr copie son entrée standard sur sa sortie standard en effectuant l'une
       des manipulations suivantes :

              ·  transposer, et éventuellement réunir les caractères dupliqués
              de la chaîne résultante
              · réunir les caractères dupliqués
              · supprimer des caractères
              · supprimer des caractères, et éventuellement  réunir  les  car-
              actères dupliqués de la chaîne résultante
pas des lignes en double.