Wie berechnet man den Durchschnitt des 2. Felds aus Dateien?

Wie berechnet man den Durchschnitt des 2. Felds aus Dateien?

Ich habe eine Datei und sie besteht aus zwei Feldern. Das erste Feldformat ist„%FT%T“.

Beispieldaten:

2019-01-01T00:00:00  4.8
2019-01-01T01:00:00  5.1
2019-01-01T02:00:00  5.4
2019-01-01T03:00:00  5.7
2019-01-01T04:00:00  5.8
2019-01-01T05:00:00  5.4
2019-01-01T06:00:00  5
2019-01-01T07:00:00  4.4
2019-01-01T08:00:00  3.8
2019-01-01T09:00:00  3.7
2019-01-01T10:00:00  3.8
2019-01-01T11:00:00  4.1
2019-01-01T12:00:00  5
2019-01-01T13:00:00  6.7
2019-01-01T14:00:00  8.4
2019-01-01T15:00:00  9.1
2019-01-01T16:00:00  8.6
2019-01-01T17:00:00  8.5
2019-01-01T18:00:00  8.6
2019-01-01T19:00:00  8.1
2019-01-01T20:00:00  8
2019-01-01T21:00:00  6.9
2019-01-01T22:00:00  5.6
2019-01-01T23:00:00  5.2
2019-01-02T00:00:00  5.2
2019-01-02T01:00:00  5.3
2019-01-02T02:00:00  5.8
2019-01-02T03:00:00  6
2019-01-02T04:00:00  5.7
2019-01-02T05:00:00  5.4
2019-01-02T06:00:00  5.7
2019-01-02T07:00:00  5.3
2019-01-02T08:00:00  4.8
2019-01-02T09:00:00  4.3
2019-01-02T10:00:00  3.6
2019-01-02T11:00:00  2.8
2019-01-02T12:00:00  3.2
2019-01-02T13:00:00  4.2
2019-01-02T14:00:00  4.9
2019-01-02T15:00:00  5.4
2019-01-02T16:00:00  5.9
2019-01-02T17:00:00  6.5
2019-01-02T18:00:00  6.7
2019-01-02T19:00:00  7.1
2019-01-02T20:00:00  5.7
2019-01-02T21:00:00  4.4
2019-01-02T22:00:00  4.1
2019-01-02T23:00:00  3.8
2019-01-03T00:00:00  4
2019-01-03T01:00:00  3.5
2019-01-03T02:00:00  3.6
2019-01-03T03:00:00  4
2019-01-03T04:00:00  4.2
2019-01-03T05:00:00  3.9
2019-01-03T06:00:00  3.7
2019-01-03T07:00:00  3.8
2019-01-03T08:00:00  3.7
2019-01-03T09:00:00  3.7
2019-01-03T10:00:00  4
2019-01-03T11:00:00  4.7
2019-01-03T12:00:00  5.4
2019-01-03T13:00:00  6.5
2019-01-03T14:00:00  7.6
2019-01-03T15:00:00  7.7
2019-01-03T16:00:00  7.3
2019-01-03T17:00:00  7.4
2019-01-03T18:00:00  8
2019-01-03T19:00:00  8.5
2019-01-03T20:00:00  8.1
2019-01-03T21:00:00  6.5
2019-01-03T22:00:00  5.6
2019-01-03T23:00:00  5.6

Ich möchte den Tagesdurchschnitt der 2. Spalte berechnen.

Die Ausgabe sollte wie folgt aussehen ...

01-01-2019 6.1
02-01-2019 5.1
03-01-2019 5.5

Antwort1

Ein awk-Ansatz:

$ awk '{ 
    date=substr($1,1,10); 
    tot[date]+=$2; 
    num[date]++
    }
    END{
        for(date in tot){
            printf "%s %.1f\n", date,tot[date]/num[date]
        }
    }' file 
2019-01-01 6.1
2019-01-02 5.1
2019-01-03 5.5

Antwort2

Verwenden vonMüller

$ mlr --nidx --repifs put '
    $1 = strftime(strptime($1,"%FT%T"),"%d-%m-%Y")
  ' then stats1 -a mean -f 2 -g 1 file
01-01-2019 6.070833
02-01-2019 5.075000
03-01-2019 5.458333

Das Formatieren der Ergebnisse scheint ein Bereich zu sein, in dem Miller einige Defizite hat. Wenn Sie das also brauchen, schlage ich vor, die Ergebnisse durch numfmtz. B. weiterzuleiten.

$ mlr --nidx --repifs put '
    $1 = strftime(strptime($1,"%FT%T"),"%d-%m-%Y")
  ' then stats1 -a mean -f 2 -g 1 file | numfmt --field=2 --format='%.1f'
01-01-2019      6.1
02-01-2019      5.1
03-01-2019      5.5

Alternativ können Sie mit einer ausreichend aktuellen Version von GNU awk und unter Verwendung von und mktimezum Indizieren der Arrays mit der Epochenzeit des Datums Folgendes tun:sumcount

gawk '
  {
    split($1,dt,"[-T:]");
    k = mktime(sprintf("%04d %02d %02d 00 00 00", dt[1], dt[2], dt[3]));
    sum[k] += $2; count[k] += 1;
  }
  END {
    PROCINFO["sorted_in"] = "@ind_num_asc";
    for(k in count) printf "%s %.1f\n", strftime("%d-%m-%Y",k), sum[k]/count[k];
  }
' file

Eine weitere Alternative mit csvsql/ csvformataus dem Python-basierten csvkit:

$ csvsql -d ' ' -HS --query '
    SELECT strftime("%d-%m-%Y",date(a)) AS [Day], round(avg(b),1) AS [Avg] FROM file GROUP BY date(a)
  ' file | csvformat -T
/usr/lib/python3/dist-packages/agate/table/from_csv.py:88: RuntimeWarning: Column names not specified. "('a', 'b')" will be used as names.
Day Avg
01-01-2019  6.1
02-01-2019  5.1
03-01-2019  5.5

verwandte Informationen