Question

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 souhaite le faire depuis vi/vim, si possible.

Était-ce utile?

La solution

Si le tri de votre fichier vous convient, vous pouvez utiliser:

:sort u

Autres conseils

Essayez ceci:

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

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

Faites une copie de votre fichier avant de l’essayer. Ce n'est pas testé.

À partir de la ligne de commande, faites simplement:

sort file | uniq > file.new

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

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

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

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.

Sélectionnez les lignes en mode ligne visuelle ( Shift + v ), puis :!uniq. Cela ne prendra que les doublons qui se succèdent.

Concernant la façon dont Uniq peut être implémenté dans VimL, ​​recherchez Uniq dans un plugin que je maintiens.Vous verrez différentes façons de l'implémenter, indiquées sur la liste de diffusion Vim.

Sinon, :sort u est effectivement la voie à suivre.

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

ou

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

C’est ma réponse pour vous, il peut supprimer plusieurs lignes en double et n'en gardez qu'un, ne l'enlevez pas!

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.

Cette version ne supprime que les lignes répétées qui sont contigües. Je veux dire, ne supprime que les lignes répétées consécutives. En utilisant la carte donnée, la fonction note les dégâts avec des lignes vides. Mais si vous modifiez le REGEX pour qu’il corresponde au début de la ligne ^, cela supprimera également les lignes vides dupliquées.

" function to delete duplicate lines
function! DelDuplicatedLines()
    while getline(".") == getline(line(".") - 1)
        exec 'norm! ddk'
    endwhile
    while getline(".") == getline(line(".") + 1)
        exec 'norm! dd'
    endwhile
endfunction
nnoremap <Leader>d :g/./call DelDuplicatedLines()<CR>

Une autre méthode qui n'utilise pas vi / vim (pour les très gros fichiers) consiste à partir de la ligne de commande Linux avec sort et uniq:

sort {file-name} | uniq -u

Cela a fonctionné pour moi à la fois .csv et .txt

awk '!seen[$0]++' <filename> > <newFileName>

Explication: La première partie de la commande imprime des lignes uniques et la seconde, c’est-à-dire après la flèche du milieu, consiste à enregistrer le résultat de la première partie.

awk '!seen[$0]++' <filename>

>

<newFileName>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top