Supprimer la ligne si la ligne suivante est la même

15

Quelle commande sed / awk puis-je utiliser? sort -uSupprime simplement toutes les instances

Contribution:

abc
abc
def
abc
abc
def

Production attendue:

abc
def
abc
def
干 猕猴桃
la source

Réponses:

36

C'est à cela que uniqsert la commande standard.

uniq your-file

Notez que certaines uniqimplémentations comme GNU uniqvous donneront le premier d'une séquence de lignes qui trient les mêmes (où strcoll()retourne 0) au lieu d' être identiques octet à octet (où memcmp()ou strcmp()retourne 0). Pour forcer une comparaison octet à octet quelle que soit l' uniqimplémentation, vous pouvez forcer les paramètres régionaux à Cavec:

LC_ALL=C uniq your-file
Stéphane Chazelas
la source
7

Vim peut très bien y parvenir:

:g/\v^(.*\n)\1/d

Ou si vous préférez utiliser vim comme outil de ligne de commande, vous pouvez le faire comme

vim file -c "g/\v^(.*\n)\1/d" -c "wq"

De cette façon, vous n'avez pas à vous battre pour quitter vim plus tard;)

Explication:

:g/

Sur toutes les lignes qui correspondent à cette expression régulière ...

\v^(.*\n)\1

Toute ligne suivie par elle-même ...

/d

exécutez la commande d elete (supprimez la ligne actuelle). La -c "wq"consiste à enregistrer les modifications et à quitter.

James
la source
Notez qu'avec vim 8.1.2112 au moins, cela ne fonctionne pas pour les lignes dupliquées qui sont les deux dernières lignes du fichier. En outre, il supprime uniquement un doublon des séquences de 3 lignes en double.
Stéphane Chazelas
1
@ StéphaneChazelas sauf que nous manquons actuellement de spécification pour le comportement souhaité dans le cas de 3 lignes - je pouvais voir le comportement souhaité dans les deux sens.
D. Ben Knoble