Supprimer leslignes en double d'un fichier
Résolu
Ssylvainsab
Messages postés
2892
Statut
Modérateur
-
samsoul92 -
samsoul92 -
Bonjour.
COmme l'indique le titre, j'ai un fichier texte très gros (presque 20000 Lignes), avec plusieurs lignes en double, en triple, en quadruple, voire des centaines de fois.
J'aurais besoin de supprimer les lignes en double du fichier.
Pour précision, toutes les lignes se terminent par un point-virgule ";" et ce caractère est présent une fois et une seule par ligne.
(en fait chaque ligne est une commande)
Donc je cherche comment faire un script en bash qui parcoure les lignes de mon fichier une à une, et pour chaque ligne vérifie s'il en existe une autre pareille, et si c'est le cas l'efface.
Quelqu'un a-t-il une solution ?
Merci.
--
Sylvain
COmme l'indique le titre, j'ai un fichier texte très gros (presque 20000 Lignes), avec plusieurs lignes en double, en triple, en quadruple, voire des centaines de fois.
J'aurais besoin de supprimer les lignes en double du fichier.
Pour précision, toutes les lignes se terminent par un point-virgule ";" et ce caractère est présent une fois et une seule par ligne.
(en fait chaque ligne est une commande)
Donc je cherche comment faire un script en bash qui parcoure les lignes de mon fichier une à une, et pour chaque ligne vérifie s'il en existe une autre pareille, et si c'est le cas l'efface.
Quelqu'un a-t-il une solution ?
Merci.
--
Sylvain
12 réponses
-
sorry
j'avais pas fait attention car g suis débutant
donc avec : cat fichier | sort | uniq
cela fonctionne! -
je vous donne vite fait un algo pour supprimer les lignes mutiples sans modifier leur ordre initial (scripté en bash mais performant)
il faut copier coller les lignes ci dessous dans un fichier (Je l'ai appelé "vir_ligne_doublon")
un chmod +x dessus.
EN GROS:
je repère les doublons avec les binaire sort et uniq ( super rapidement) et ensuite je filtre chaque ligne une par une avec un filtre qui ne se met a jour qu'avec les lignes en doublon. (Les autres n'ayant pas besoin d'être filtrées)
Utilisation : ./vir_ligne_doublon Fichier_a_épurer
Cela génère un nouveau fichier nommé Fichier_a_épurer.nodoublon
#!/bin/bash
FILE=$1
echo Analyse :
sort $FILE|uniq -c|tee report|awk '$1 > 1'|sed "s/^[^0-9]*\([0-9][0-9]*\) \(.*\)$/Il y a \1 fois: \2/"
echo "Continuer ? (Ou CTRL/C)" ; read A
awk '$1 > 1' report|sed "s/^[^0-9]*[0-9][0-9]* //" > en_doublon
>filtre ; >$FILE.nodoublon
while read LIGNE
do
echo "$LIGNE"|grep -vxf filtre |tee -a $FILE.nodoublon|grep -xf en_doublon >> filtre
done < $FILE
rm en_doublon filtre
echo Nombre de lignes avant et apres
wc -l $FILE*
echo Resultat:
sed "s/^/ /" $FILE.nodoublon -
plus simple j'ai trouvé ça Delete duplicate lines : http://textop.us/Lines-tools/Delete-Duplicate-Lines
-
-
@boly38 Text Mechanic http://textmechanic.com/text-tools/basic-text-tools/remove-duplicate-lines/
-
-
si l'ordre des lignes n'est pas important:
cat fichier | sort | uniq
sinon, perl est mieux pour ça à mon avis -
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Salut,
Y-a-t'il la possibilité de trier ton fichier avant ? Si oui :sort -u fichier
;-))
-
bonjour,
ya pas la même commande (sort -u) sous windows ... j'arrive pas à effacer les doublons .. quand j'essaye avec cette commande il me sort cet erreur (fichier d'entré spécifié deux fois) -
Trier mon fichier, c'est à dire mettre les lignes identiques les unes après les autres ?
C'est déjà fait ;-)
--
Sylvain -
Alors la solution t'est donnée au-dessus en double ;-))
-
Merci !
Waow, même avec ce tri, j'ai encore 1000 lignes... ça en fait du code :p
--
Sylvain -
bonjour
Dans une liste, stockée dans un fichier texte avec un enregistrement par ligne,j'aimerais écrire un commande qui supprime les doublons
kelkun a t il une idée? -
-