Outra opção é verificar NF , por exemplo:
awk '!NF || !seen[$0]++'
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.
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.
awk '/^[[:blank:]]*$/ { print; next; }; !seen[$0]++'
Tudo o que você precisa fazer é procurar uma linha vazia (vazia ou vazia) primeiro.
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.
Tags awk