
Estou procurando um código para remover linhas duplicadas depois de comparar o primeiro padrão delimitado por tabulações:
Exemplo: ( ↦
= guia)
car ↦ ab ↦ 38/43
car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
house ↦ d ↦ 2/3
house ↦ ht ↦ 3/7
boat ↦ as ↦ 5/5
Quero deletar linhas duplicadas, com a restrição de que a linha que está ca
no segundo campo não deve ser deletada.
Resultado:
car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
boat ↦ as ↦ 5/5
Alguma ideia? Tentei sed e sort, mas não obtive nenhum código funcional.
Responder1
Presumo que, se houver entradas duplicadas, sempre haverá uma ca
como segundo campo.
Nos seus dados de exemplo, todas as linhas que possuem o mesmo primeiro campo são agrupadas, mas você não mencionou se esse é sempre o caso. Se for, a tarefa será um pouco mais simples, mas o script awk abaixo funcionará mesmo se as linhas correspondentes não estiverem agrupadas.
desduplicação.awk
#!/usr/bin/awk -f
{
if (!($1 in lines) || ($2 == "ca"))
lines[$1] = $0
}
END{
for (i in lines)
print lines[i]
}
Se o arquivo de entrada for chamado data
, você o executará assim:
awk -f dedup.awk data
ou
awk -F '\t' -f dedup.awk data
para garantir que ele use tab como separador de campo; o separador de campo padrão é um ou mais espaços e/ou tabulações. Veja Fields
na página de manual do gawk para mais informações.
Devido à forma como os arrays awk funcionam, os dados de saída provavelmente não estarão na mesma ordem que os dados de origem. A ordem original poderia ser preservada com um programa um pouco mais complicado, ou a saída poderia ser classificada usando uma das funções de classificação do awk, mas provavelmente é mais flexível usar o comando bash sort.
Esse script awk pode ser condensado, se você quiser:
awk '{if(!($1 in a)||($2=="ca"))a[$1]=$0};END{for(i in a)print a[i]}' data