Eliminar líneas duplicadas después de comparar el primer patrón y el patrón especial

Eliminar líneas duplicadas después de comparar el primer patrón y el patrón especial

Estoy buscando código para eliminar líneas duplicadas después de comparar el primer patrón delimitado por tabulaciones:

Ejemplo: ( = pestaña)

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

Quiero eliminar líneas duplicadas, con la restricción de que la línea cadel segundo campo no debe eliminarse.

Resultado:

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

¿Algunas ideas? Intenté sed y sort, pero no obtengo ningún código que funcione.

Respuesta1

Supongo que si hay entradas duplicadas, siempre habrá una cacomo segundo campo.

En los datos de su ejemplo, todas las líneas que tienen el mismo primer campo están agrupadas, pero no mencionó si ese es siempre el caso. Si es así, entonces la tarea es un poco más simple, pero el siguiente script awk funcionará incluso si las líneas coincidentes no están agrupadas.

dedup.awk

#!/usr/bin/awk -f

{
    if (!($1 in lines) || ($2 == "ca"))
        lines[$1] = $0
}

END{
    for (i in lines) 
        print lines[i]
}

Si el archivo de entrada se llama data, lo ejecutará así:

awk -f dedup.awk data

o

awk -F '\t' -f dedup.awk data

para asegurarse de que utilice la pestaña como separador de campos; el separador de campos predeterminado es uno o más espacios y/o tabulaciones. Consulte Fieldsla página de manual de Gawk para obtener más información.

Debido a la forma en que funcionan las matrices awk, los datos de salida probablemente no estarán en el mismo orden que los datos de origen. El orden original podría conservarse con un programa un poco más complicado, o la salida podría ordenarse usando una de las funciones de clasificación de awk, pero probablemente sea más flexible usar el comando bash sort.

Ese script awk se puede condensar, si lo desea:

awk '{if(!($1 in a)||($2=="ca"))a[$1]=$0};END{for(i in a)print a[i]}' data

información relacionada