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