2016-06-02 11 views
-2

Ich habe Schwierigkeiten, eine Komma getrennte Datei mit awk neu zu formatieren. Die Datei enthält Minuten-Daten für einen Tag für mehrere Server und für mehrere Metriken
zB 2 Datensätze pro Minute, pro Server für 24 StundenAWK-Datei Neuformatierung

Beispiel Eingabedatei:

server01,00:01:00,AckDelayAverage,9999 
server01,00:01:00,AckDelayMax,8888 
server01,00:02:00,AckDelayAverage,666 
server01,00:02:00,AckDelayMax,5555 
..... 
server01,23:58:00,AckDelayAverage,4545 
server01,23:58:00,AckDelayMax,8777 
server01,23:59:00,AckDelayAverage,4686 
server01,23:59:00,AckDelayMax,7820 
server02,00:01:00,AckDelayAverage,1231 
server02,00:01:00,AckDelayMax,4185 
server02,00:02:00,AckDelayAverage,1843 
server02,00:02:00,AckDelayMax,9982 
..... 
server02,23:58:00,AckDelayAverage,1022 
server02,23:58:00,AckDelayMax,1772 
server02,23:59:00,AckDelayAverage,1813 
server02,23:59:00,AckDelayMax,9891 

Ich versuche zu re- forma~~POS=TRUNC die Datei für jede Minute mit einer einzigartigen Verkettung von Feldern 1 & 3 als die Spaltenüberschriften

zB der erwartete Ausgabedatei wie eine einzige Reihe haben aussehen:

Minute, server01-AckDelayAverage,server01-AckDelayMax, server02-AckDelayAverage,server02-AckDelayMax 

00:01:00,9999,8888,1231,4185 
00:02:00,666,5555,1843,8892 
... 
... 
23:58:00,4545,8777,1022,1772 
23:59:00,4686,7820,1813,9891 
+0

Sie könnten den 'join' Befehl für Datengruppierung versuchen. Andernfalls assoziative Arrays in 'awk' mit der Timestamp-Zeichenfolge als Schlüssel. – Dummy00001

+2

Hoppla, du hast vergessen, deinen Code zu posten! StackOverflow hilft Leuten, ihren Code zu reparieren. Es ist kein kostenloser Kodierungsdienst. Jeder Code ist besser als gar kein Code. Meta-Code, sogar, wird zeigen, wie Sie denken, dass ein Programm funktionieren sollte, auch wenn Sie nicht wissen, wie man es schreibt. – ghoti

Antwort

0

Eine Lösung mit GNU awk. Rufen Sie dies als awk -F, -f script input_file:

/Average/ { average[$2, $1] = $4; } 
/Max/ { maximum[$2, $1] = $4; } 
{ 
    if (!($2 in minutes)) { 
     minutes[$2] = 1; 
    } 
    if (!($1 in servers)) { 
     servers[$1] = 1; 
    } 
} 
END { 
    mcount = asorti(minutes, smin); 
    scount = asorti(servers, sserv); 
    printf "minutes"; 
    for (col = 1; col <= scount; col++) { 
     printf "," sserv[col] "-average," sserv[col] "-maximum"; 
    } 
    print ""; 
    for (row = 1; row <= mcount; row++) { 
     key = smin[row]; 
     printf key; 
     for (col = 1; col <= scount; col++) { 
      printf "," average[key, sserv[col]] "," maximum[key, sserv[col]]; 
     } 
     print ""; 
    } 
} 
0

Mit awk und sort:

awk -F, -v OFS=, '{ 
    a[$2]=(a[$2]?a[$2]","$4:$4) 
} 
END{ 
    for (i in a) print i,a[i] 
}' File | sort 

Wenn $4 hat 0 Werte:

awk -F, -v OFS=, '!a[$2]{a[$2]=$2} {a[$2]=a[$2]","$4} END{for (i in a) print a[i]}' | sort 

!a[$2]{a[$2]=$2}: Wenn Array mit a mit Index $2 (die Zeit, in Minute) wird nicht beendet, Array a mit Index als $2 (die Zeit in Minuten) mit Wert wie $2 erstellt wird. True, wenn das erste Mal in der Zeile eingegeben wird.

{a [$ 2] = a [$ 2] "" $ 4}: Verketten Wert $4 auf dieses Array

END: in Array alle Werte von a Drucken

Schließlich Rohr dieses awk Ergebnis zu sortieren .

+0

vielen Dank, das funktioniert in den meisten Fällen perfekt. Eine Beobachtung, die ich gesehen habe, ist, wenn die ersten Metriken eines Minutenwerts 0 ist, die Daten nicht richtig umgesetzt werden. e, g Server01,00: 01: 00, AckDelayAverage, 0 Server01,00: 01: 00, AckDelayMax, 0 Server01,00: 02: 00, AckDelayAverage, 666 Server01,00: 02: 00, AckDelayMax, 5555 – JustinE

+0

Katzentest | awk -F, -v OFS =, '{a [$ 2] = (a [$ 2]? a [$ 2] "," $ 4: $ 4)} END {für (i in a) drucken i, a [i]} 00: 01: 00,0 00: 02: 00,666,5555 – JustinE

+0

Das liegt nicht an den Minutenwerten, sondern daran, dass '$ 4' '0' ist. Ich habe die Antwort mit einer Lösung bearbeitet, um dies zu überwinden. – 7171u

0

Lauf awk Befehl: ./script.awk Datei

#! /bin/awk -f 
BEGIN{ 
    FS=","; 
    OFS="," 
} 
$1 ~ /server01/ && $3 ~ /Average/{ 
    a[$2]["Avg01"] = $4; 
} 
$1 ~ /server01/ && $3 ~ /Max/{ 
    a[$2]["Max01"] = $4; 
} 
$1 ~ /server02/ && $3 ~ /Average/{ 
    a[$2]["Avg02"] = $4; 
} 
$1 ~ /server02/ && $3 ~ /Max/{ 
    a[$2]["Max02"] = $4; 
} 
END{ 
    print "Minute","server01-AckDelayAverage","server01-AckDelayMax","server02-AckDelayAverage","server02-AckDelayMax" 
    for(i in a){ 
     print i,a[i]["Avg01"],a[i]["Max01"],a[i]["Avg02"],a[i]["Max02"] | "sort" 
    } 
} 
Verwandte Themen