2016-06-22 8 views
0

Ich habe die folgende Eingabe:AWK - Liefert Minimalwert in der Eingabe auf der Grundlage gemeinsame Funktion

... 
MSG1 10ms 
MSG2 20ms 
MSG3 25ms 
MSG1 5ms 
MSG3 2ms 
MSG2 1ms 
... 

Ich bin nach einer Ausgabe wie folgt aus:

MSG1 
Min: 5ms 

MSG2 
Min: 1ms 

MSG3 
Min: 2ms 

Der Code, den ich bisher habe, das hat das Layout, das ich nachdem es bin wie folgt:

#!/usr/bin/gawk -f 

BEGIN { 
     print "Testing" 
} #End of BEGIN 
{ #Start of MID 
     key = $1 #Message Extracted 10 Total 
     min = 100 
} #End of MID 
END { 
       for (MSG in MSG_TYPE) { 
         print MSG 
         print "MIN: "min 
         print "\n" 
       } 
} #End of END 

Aber ich bin nicht in der Lage den Minimalwert aus den Eingangsdaten zu ziehen. Ich weiß, wie man die Daten logisch abruft, aber das Codieren ist eine andere Sache. Jede und jede Hilfe wird sehr geschätzt.

Antwort

2

Sie können versuchen, diese awk:

awk '{m=$2+0; a[$1]=a[$1]?(m<a[$1]?m:a[$1]):m} END{for (v in a) {printf "%s\nMin: %sms\n\n", v,a[v]}}' file 

Erläuterung:

  • m=$2+0 - Welche 5ms-5 Integer-Teil macht.
  • a[$1]?(m<a[$1]?m:a[$1]):m - Am allerersten a[$1] wird leerer Wert für den Index von $1, so m als Anfangswert festlegen. Für das nächste Mal wird a[$1] Wert haben, dann die Überprüfung gegen m<a[$1].
+0

Könnten Sie im Detail zu erklären, wie das funktioniert! :) – Inian

+0

Danke dafür, aber ich möchte wirklich, dass es Teil des obigen Skriptes ist, da dies ein Teil davon ist, der angefordert wurde. – glly

+0

Erläuterung hinzugefügt. – sat

1

Eingabedatei:

cat data 
MSG1 10ms 
MSG2 20ms 
MSG3 25ms 
MSG1 5ms 
MSG3 2ms 
MSG2 1ms 

Befehl:

#List all the files with minimum values 
    #Print only first occurrence of those files. 
    #Print values below to file name 
    #Print keyword "Min:" 


    sort -g -k2 data | awk '\!seen[$1]++' | sort | xargs -n 1 | sed 's/^[0-9]/ min: &/g' 
MSG1 
    min: 5ms 
MSG2 
    min: 1ms 
MSG3 
    min: 2ms 
+0

ausdrucken. Könnten Sie bitte erklären, wie die 'awk'-Sektion funktioniert? – glly

+0

@GlennLynam: Drucke die Zeile, wenn sie noch nicht gesehen wurde, dann inkrementiere den gesehenen Zähler auf jeden Fall –

+0

Ahh ok, danke dafür. Wenn ich das im Beispiel in das Skript implementieren wollte, wie würde ich dann vorgehen? – glly