Berechnen des Durchschnitts in AWK basierend auf dem Spaltenzustand in CSV

Berechnen des Durchschnitts in AWK basierend auf dem Spaltenzustand in CSV

Ich habe folgendes csvFormat.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, date2wobei wir das vierte Feld $4als Array-Index/Schlüssel und das erste Feld $1als 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 forSchleife, 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 keygefundene Ergebnis drucken wir key(= das Datum $4) und wir drucken auch den date1[key]Wert = Summe aller $1Werte 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

verwandte Informationen