Ich habe folgendes csv
Format.Es gibt Werte aus dem ganzen Monat, aber ich habe sie in Blöcke aufgeteilt.:
2415.02,2203.35,00:17,25:May:2017,
3465.02,2203.35,01:17,25:May:2017,
2465.02,2203.35,12:17,26:May:2017,
465.02,2203.35,13:17,26:May:2017,
245.02,2203.35,14:17,26:May:2017,
2465.02,2203.35,05:17,26:May:2017,
2865.02,2203.35,06:17,27:May:2017,
2490.12,2203.35,07:17,27:May:2017,
Ich muss den Durchschnitt der ersten Spalte ($1) basierend auf den Werten für diesen Tag ($4) berechnen. Beachten Sie, dass ich das Datum neu formatieren kann, wenn dies zur einfacheren Berechnung erforderlich ist.
Mein kläglicher Versuch war dieser:
$ awk '{FS=","; day=$4;value+=$1} END{ print day,value/NR}' file
27:May:2017 2109.41
Ich brauche eine Ausgabe wie diese:
Average for 25th May is *average_for_25th_day*
Average for 27th May is *average_for_26th_day*
Average for 28th May is *average_for_27th_day*
Antwort1
Schauen Sie sich das an:
awk -F, '{date1[$4]+=$1;++date2[$4]}END{for (key in date1) print "Average of",key,"is",date1[key]/date2[key]}' file
Average of 27:May:2017 is 2677.57
Average of 26:May:2017 is 1410.02
Average of 25:May:2017 is 2940.02
Erläuterung:
-F,
: Definiert das Trennzeichen . Alternativ könnte seinawk 'BEGIN{FS=","}...
Dann erstellen wir zwei Arrays date1
, date2
wobei wir das vierte Feld $4
als Array-Index/Schlüssel und das erste Feld $1
als Wert verwenden, der zum vorhandenen Wert derselben Array-Position hinzugefügt wird.
Für die erste Reihe hätten wir also
date1[27:May:2017]+=2415.02
++date2[27:May:2017]
--> erhöht den Wert um 1 --> Wert 1 für die erste Zeile
Für das nächste gleiche Datum (Zeile 2) hätten wir
date1[27:May:2017]+=2415.02 + 3465.02
++date2[27:May:2017]
--> erhöht den Wert um 1 --> Wert 2 (zweite Zeile)
Dieselbe Logik gilt für alle Zeilen mit demselben Datum und auch für alle unterschiedlichen Daten.
Am Ende verwenden wir eine for
Schleife, um durch die Schlüssel des Arrays zu iterieren date1
(oder date2
– die Schlüssel sind in beiden Arrays gleich => $4
) und für jedes key
gefundene Ergebnis drucken wir key
(= das Datum $4) und wir drucken auch den date1[key]
Wert = Summe aller $1
Werte für dasselbe Datum $4
, geteilt durch date2[key]
den Wert = numerische Anzahl der gefundenen Zeilen mit demselben Datum = dasselbe $4
.
Antwort2
Hier ist eine Variante mitGNU DatamashSo führen Sie die Mittelwertbildung durch:
datamash -t, groupby 4 mean 1 < file |
awk -F'[,:]' '{printf "Average for %dth %s is %f\n", $1,$2,$4}'
Average for 25th May is 2940.020000
Average for 26th May is 1410.020000
Average for 27th May is 2677.570000