Wie kann ich ausgewählte Zeilen mit einem awk-Skript entfernen?
-
22-07-2019 - |
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).
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] }'