2008-12-08 10 views
87

J'ai un fichier texte qui contient une longue liste d'entrées (une sur chaque ligne). Certains d'entre eux sont des doublons, et j'aimerais savoir s'il est possible (et si oui, comment) de supprimer les doublons. Je suis intéressé à faire cela à partir de vi/vim, si possible.Suppression de lignes en double dans vi?

+1

Ressemble à un doublon de http://stackoverflow.com/questions/746689/unix-tool-to-remove-duplicate-lines-from-a-file –

+3

Celui-ci a 1 an; celui-ci est de 10 mois. Donc, d'un autre côté. – Sydius

+0

Le consensus de @Sydius est maintenant de donner la priorité au compte upvote (dont vous avez aussi plus de): http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even -bien-ce-beaucoup-nouveau-et-ha Et ce ne sont pas des doublons, qu'on ne mentionne pas Vim :-) –

Répondre

179

Si vous êtes OK avec tri votre fichier, vous pouvez utiliser:

:sort u 
+1

Le tri est acceptable et cela a résolu le problème. Merci! – Sydius

+1

C'est tellement beau. Merci! – Shrayas

+0

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

20

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

Faire une copie bien avant de l'essayer. C'est non testé.

+7

ça marche. la prochaine fois, testez-le! – hop

+1

@hop Merci de l'avoir testé pour moi. Je n'avais pas accès à vim à l'époque. – Sean

+2

cela éclaire toutes les lignes en double pour moi mais ne supprime pas, suis-je manquer une étape ici? – ak85

1

Sélectionnez les lignes en mode ligne visuelle (Maj +v), puis :!uniq. Cela n'atteindra que les doublons qui viennent les uns après les autres.

+1

Juste pour noter que cela ne fonctionnera que sur les ordinateurs avec le programme uniq installé, c'est-à-dire Linux, Mac, FreeBSD etc – anteatersa

+0

Ce sera la meilleure réponse à ceux qui n'ont pas besoin de tri. Et si vous êtes un utilisateur Windows, pensez à essayer Cygwin ou MSYS. –

0

Je voudrais utiliser !}uniq, mais cela ne fonctionne que s'il n'y a pas de lignes vides.

Pour chaque ligne d'un fichier, utilisez: :1,$!uniq.

4

je combiner 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 étiez intéressé à voir le nombre de lignes en double ont été supprimées, utilisez le contrôle-G avant et après pour vérifier le nombre de lignes présentes dans votre tampon.

+1

sort -u == tri | uniq –

+1

''uniq' n'est pas reconnu comme une commande interne ou externe, un fichier exécutable ou un fichier batch. ' – hippietrail

0

En ce qui concerne la façon dont Uniq peut être implémenté dans VimL, ​​recherchez Uniq dans un . Vous verrez différentes façons de l'implémenter dans la liste de diffusion Vim.

Sinon, :sort u est en effet le chemin à parcourir.

4
g/^\(.*\)$\n\1/d 

Fonctionne pour moi sous Windows. Les lignes doivent être triées en premier.

+1

Ceci supprimera une ligne suivant une ligne dont le préfixe est:' aaaa' suivi de 'aaaabb' va supprimer' aaaa 'par erreur. – hippietrail

14

ligne de commande juste faire:

sort file | uniq > file.new 
+0

C'était très pratique pour moi pour un gros fichier. Merci! – Rafid

+0

Impossible de faire fonctionner la réponse acceptée, car ': sort u' était suspendu sur mon gros fichier. Cela a fonctionné très rapidement et parfaitement. Je vous remercie! – Tgsmith61591

+1

''uniq' n'est pas reconnu comme commande interne ou externe, programme exécutable ou fichier séquentiel.' – hippietrail

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

ou

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

ceci est ma réponse pour vous, il peut supprimer plusieurs lignes en double et garder un seul pas enlever!

3

awk '!x[$0]++' yourfile.txt si vous souhaitez conserver l'ordre (c'est-à-dire que le tri n'est pas acceptable). Pour l'appeler depuis vim, :! peut être utilisé.

+1

C'est adorable! Ne pas avoir besoin de trier est * exactement * ce que je cherchais! – Cometsong