Excluir linha se a próxima linha for a mesma

15

Que comando sed / awk posso usar? Apenas sort -uremoverá todas as instâncias

Entrada:

abc
abc
def
abc
abc
def

Saída esperada:

abc
def
abc
def
干 猕猴桃
fonte

Respostas:

36

É para isso que uniqserve o comando padrão.

uniq your-file

Observe que algumas uniqimplementações como o GNU uniqfornecerão a primeira de uma sequência de linhas que são iguais (onde strcoll()retorna 0), ao contrário de que são idênticas por bytes a byte (onde memcmp()ou strcmp()retorna 0). Para forçar uma comparação de bytes a bytes, independentemente da uniqimplementação, você pode forçar o código do idioma Ccom:

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

O Vim pode conseguir isso muito bem:

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

Ou se você preferir usar o vim como uma ferramenta de linha de comando, faça isso como

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

Dessa forma, você não precisa sair do vim mais tarde;)

Explicação:

:g/

Em todas as linhas que correspondem a este regex ...

\v^(.*\n)\1

Qualquer linha seguida por ela mesma ...

/d

executar o d comando elete (apagar a linha atual). O -c "wq"é para salvar as alterações e sair.

DJMcMayhem
fonte
Observe que, pelo menos no vim 8.1.2112, ele não funciona para linhas duplicadas que são as duas últimas linhas do arquivo. Além disso, ele remove apenas uma duplicata das seqüências de 3 linhas duplicadas.
Stéphane Chazelas
1
@ StéphaneChazelas, exceto que atualmente não temos especificações para o comportamento desejado no caso de três linhas - eu pude ver o comportamento desejado nos dois sentidos.
D. Ben Knoble 6/10/19