Frage

Ich bin kochend eine Ausgabe des Programms durch einige awk-Befehle, und ich bin fast wo ich sein muss. Der Befehl so weit ist:

myprogram | awk '/chk/ { if ( $12 > $13) printf("%s %d\n", $1, $12 - $13); else  printf("%s %d\n", $1, $13 - $12)  }  ' | awk '!x[$0]++'

Das letzte Bit ist ein armer Mann uniq, die auf meinem Ziel nicht verfügbar ist. Angesichts der Möglichkeit, über den Befehl eine Ausgabe wie diese erzeugt:

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

Was möchte ich haben, ist dies:

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

Das heißt, ich möchte nur Zeile drucken, die einen Maximalwert für einen bestimmten Tag hat (das erste ‚Feld‘). Das obige Beispiel ist repräsentativ für die bei den Daten daß der Ausgang sortier wird (als ob es durch einen Befehl sort verrohrt worden war).

War es hilfreich?

Lösung

Auf der Grundlage meiner beantworten ein ähnliches Bedürfnis, hält dieses Skript der Dinge in Ordnung und hat ein großes Array nicht akkumulieren. Er druckt die Zeile mit dem höchsten Wert aus jeder Gruppe.

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

Andere Tipps

Wenn Sie nicht die Einzelteile müssen in der gleichen Reihenfolge sein, sie Ausgabe von myprogram waren die folgenden Werke:

... | awk '{ if ($2 > x[$1]) x[$1] = $2 } END { for (k in x) printf "%s %s", k, x[k] }'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top