Pregunta

Estoy canalizando la salida de un programa a través de algunos comandos awk, y estoy casi donde necesito estar. El comando hasta ahora es:

myprogram | awk '/chk/ { if ( $12 > $13) printf("%s %d\n", $1, $12 - $13); else  printf("%s %d\n", $1, $13 - $12)  }  ' | awk '!x[
GR_CB20-chk_2, 0
GR_CB20-chk_2, 3
GR_CB200-chk_2, 0
GR_CB200-chk_2, 1
GR_HB20-chk_2, 0
GR_HB20-chk_2, 6
GR_HB20-chk_2, 0
GR_HB200-chk_2, 0
GR_MID20-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 0
GR_MID200-chk_2, 2
]++'

El último bit es uniq de un hombre pobre, que no está disponible en mi objetivo. Dada la posibilidad, el comando anterior produce una salida como esta:

GR_CB20-chk_2, 3
GR_CB200-chk_2, 1
GR_HB20-chk_2, 6
GR_HB200-chk_2, 0
GR_MID20-chk_2, 3
GR_MID200-chk_2, 2

Lo que me gustaría tener es esto:

<*>

Es decir, me gustaría imprimir solo una línea que tenga un valor máximo para una etiqueta dada (el primer 'campo'). El ejemplo anterior es representativo de los datos at en que la salida se ordenará (como si se hubiera canalizado a través de un comando sort ).

¿Fue útil?

Solución

Basado en mi respuesta a una necesidad similar, este script mantiene las cosas en orden y no acumula una gran variedad. Imprime la línea con el valor más alto de cada grupo.

#!/usr/bin/awk -f
{
    s = substr(<*>, 0, match(<*>, /,[^,]*$/))
    if (s != prevs) {
        if ( FNR > 1 ) print prevline
        prevval = $2
        prevline = <*>
    }
    else if ( $2 > prevval ) {
        prevval = $2
        prevline = <*>
    }
    prevs = s
}
END {
    print prevline
}

Otros consejos

Si no necesita que los elementos estén en el mismo orden en que salieron de myprogram, lo siguiente funciona:

... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top