Removendo linhas duplicadas depois de comparar o primeiro padrão e o padrão especial

1

Estou procurando código para remover linhas duplicadas depois de comparar o primeiro padrão delimitado por tabulação:

Exemplo: ( = tab)

car ↦ ab ↦ 38/43
car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
house ↦ d ↦ 2/3
house ↦ ht ↦ 3/7
boat ↦ as ↦ 5/5

Eu quero excluir para duplicar linhas, com a restrição de que a linha com ca no segundo campo não deve ser excluída.

Resultado:

car ↦ ca ↦ 2/34
house ↦ ca ↦ 34/34
boat ↦ as ↦ 5/5

Alguma ideia? Eu tentei sed e classificar, mas eu não recebo nenhum código de trabalho.

    
por Alex 17.11.2014 / 00:05

1 resposta

2

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
    
por 17.11.2014 / 06:09