Elimina riga se la riga successiva è uguale


15

Quale comando sed / awk posso usare? Basta sort -urimuoverà tutte le istanze

Ingresso:

abc
abc
def
abc
abc
def

Uscita prevista:

abc
def
abc
def

Risposte:


36

Ecco a cosa uniqserve il comando standard.

uniq your-file

Nota che alcune uniqimplementazioni come GNU uniqti daranno la prima di una sequenza di righe che ordinano la stessa (dove strcoll()restituisce 0) invece che sono identici byte per byte (dove memcmp()o strcmp()restituisce 0). Per forzare un confronto byte a byte indipendentemente uniqdall'implementazione, è possibile forzare le impostazioni internazionali Ccon:

LC_ALL=C uniq your-file

7

Vim può farlo bene:

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

O se preferisci usare vim come strumento da riga di comando, puoi farlo come

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

In questo modo non dovrai lottare con l'uscita da Vim in seguito;)

Spiegazione:

:g/

Su tutte le righe che corrispondono a questa regex ...

\v^(.*\n)\1

Qualsiasi linea seguita da sola ...

/d

esegui il comando d elete (elimina la riga corrente). Il -c "wq"è quello di salvare le modifiche e uscire.


Si noti che almeno con vim 8.1.2112, non funziona per le righe duplicate che sono le ultime due righe del file. Inoltre, rimuove solo un duplicato dalle sequenze di 3 righe duplicate.
Stéphane Chazelas,

1
@ StéphaneChazelas tranne per il fatto che al momento non disponiamo delle specifiche per il comportamento desiderato nel caso a 3 righe: ho potuto vedere il comportamento desiderato in entrambi i modi.
D. Ben Knoble,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.