141 votes

Suppression des lignes en double dans vi ?

J'ai un fichier texte qui contient une longue liste d'entrées (une par ligne). Certaines d'entre elles sont des doublons, et j'aimerais savoir s'il est possible (et si oui, comment) de supprimer tous les doublons. J'aimerais faire cela à partir de vi/vim, si possible.

1 votes

On dirait un doublon de stackoverflow.com/questions/746689/

4 votes

Celui-ci a 1 an, celui-là a 10 mois. Donc, dans l'autre sens.

0 votes

@Sydius le consensus actuel est de donner la priorité au nombre de votes positifs (que vous avez également plus) : meta.stackexchange.com/questions/147643/ Et ce ne sont pas des doublons, celui-là ne mentionne pas Vim :-)

318voto

Brian Carper Points 40078

Si vous êtes d'accord pour trier votre fichier, vous pouvez utiliser :

:sort u

9 votes

C'est tellement beau. Merci.

20 votes

Si le tri est inacceptable, utilisez :%!uniq pour supprimer simplement les entrées en double sans trier le fichier.

0 votes

Une fois que vous utilisez la commande, tout le fichier est modifié ? comment revenir en arrière ? J'ai déjà enregistré le fichier par erreur... c'est ma faute.

32voto

Sean Points 1593

Essayez ça :

:%s/^\(.*\)\(\n\1\)\+$/\1/

Il recherche toute ligne immédiatement suivie d'une ou plusieurs copies de lui-même, et la remplace par une seule copie.

Faites une copie de votre fichier avant de l'essayer. C'est non testé.

1 votes

@hop Merci de l'avoir testé pour moi. Je n'avais pas accès à vim à ce moment-là.

2 votes

Cela met en évidence toutes les lignes en double pour moi mais ne supprime pas, est-ce que je manque une étape ici ?

0 votes

Je suis presque sûr que cela mettra également en évidence une ligne suivie d'une ligne qui a le même "préfixe" mais qui est plus longue.

26voto

Kevin Points 387

En ligne de commande, il suffit de faire :

sort file | uniq > file.new

1 votes

C'était très pratique pour moi pour un énorme fichier. Merci !

1 votes

Je n'ai pas réussi à faire fonctionner la réponse acceptée, car :sort u était accroché à mon grand dossier. Cela a fonctionné très rapidement et parfaitement. Merci !

1 votes

'uniq' is not recognized as an internal or external command, operable program or batch file.

6voto

Jon DellOro Points 368

Je combinerais deux des réponses ci-dessus :

go to head of file
sort the whole file
remove duplicate entries with uniq

1G
!Gsort
1G
!Guniq

Si vous souhaitez savoir combien de lignes en double ont été supprimées, utilisez control-G avant et après pour vérifier le nombre de lignes présentes dans votre tampon.

1 votes

'uniq' is not recognized as an internal or external command, operable program or batch file.

6voto

Bridgey Points 197
g/^\(.*\)$\n\1/d

Cela fonctionne pour moi sous Windows. Les lignes doivent cependant être triées d'abord.

1 votes

Cela supprimera une ligne qui suit une ligne qui est son préfixe : aaaa suivi par aaaabb supprimera aaaa par erreur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X