Como remover linhas duplicadas com o awk enquanto mantém linhas vazias?

10

Abaixo, o comando awk remove todas as linhas duplicadas conforme explicado aqui :

awk '!seen[$0]++'

Se o texto contiver linhas vazias, todas, exceto uma linha vazia, serão excluídas.

Como posso manter todas as linhas vazias enquanto apago todas as linhas duplicadas não vazias, usando apenas awk ? Por favor, inclua também uma breve explicação.

    
por Serge Stroobandt 21.05.2014 / 01:40

4 respostas

22

Outra opção é verificar NF , por exemplo:

awk '!NF || !seen[$0]++'
    
por 21.05.2014 / 02:16
8

Alternativamente

awk '!/./ || !seen[$0]++' file

O truque principal é o mesmo, seen[$0]++ cria uma entrada na matriz associativa seen cuja chave é a linha atual ( $0 ). Portanto, !seen[$0]++ será falso se esta linha já tiver sido vista. O /./ está verificando se a linha contém caracteres não-brancos, portanto !/./ corresponde a linhas não vazias. Combinado com || !seen[$0]++ , ele ignorará todas as linhas duplicadas, exceto as em branco, e imprimirá o restante.

    
por 21.05.2014 / 02:13
5
awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'

Tudo o que você precisa fazer é procurar uma linha vazia (vazia ou vazia) primeiro.

    
por 21.05.2014 / 01:44
5

Aqui está outra solução awk , semelhante à resposta do @ Thor, menos concisa, mas mais eficiente:

awk '!NF {print;next}; !($0 in a) {a[$0];print}' file

Com isso, só verificamos que a[$0] existiu ou não. Caso contrário, inicialize e imprima. Neste caso, não temos nenhuma referência, atribuição a a[$0] se existisse.

    
por 21.05.2014 / 08:37

Tags