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?
Répondre
Si vous êtes OK avec tri votre fichier, vous pouvez utiliser:
:sort u
Essayez ceci:
:%s/^\(.*\)\n\1$/\1/
Faire une copie bien avant de l'essayer. C'est non testé.
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.
Juste pour noter que cela ne fonctionnera que sur les ordinateurs avec le programme uniq installé, c'est-à-dire Linux, Mac, FreeBSD etc – anteatersa
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. –
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
.
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.
sort -u == tri | uniq –
''uniq' n'est pas reconnu comme une commande interne ou externe, un fichier exécutable ou un fichier batch. ' – hippietrail
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.
g/^\(.*\)$\n\1/d
Fonctionne pour moi sous Windows. Les lignes doivent être triées en premier.
Ceci supprimera une ligne suivant une ligne dont le préfixe est:' aaaa' suivi de 'aaaabb' va supprimer' aaaa 'par erreur. – hippietrail
ligne de commande juste faire:
sort file | uniq > file.new
C'était très pratique pour moi pour un gros fichier. Merci! – Rafid
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
''uniq' n'est pas reconnu comme commande interne ou externe, programme exécutable ou fichier séquentiel.' – hippietrail
:%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!
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é.
C'est adorable! Ne pas avoir besoin de trier est * exactement * ce que je cherchais! – Cometsong
Ressemble à un doublon de http://stackoverflow.com/questions/746689/unix-tool-to-remove-duplicate-lines-from-a-file –
Celui-ci a 1 an; celui-ci est de 10 mois. Donc, d'un autre côté. – Sydius
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 :-) –