Suponho que, se houver entradas duplicadas, sempre haverá uma com ca
como o segundo campo.
Em 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.
dedup.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 de data
, você o executaria da seguinte forma:
awk -f dedup.awk data
ou
awk -F '\t' -f dedup.awk data
para garantir que ele use a guia como o separador de campo; o separador de campo padrão é um ou mais espaços e / ou guias. Veja Fields
na página de manual do gawk para mais informações.
Devido à maneira como as matrizes 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 ordenada 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