Durchschnitt für alle Zahlen mit unregelmäßigen Spalten ermitteln

Durchschnitt für alle Zahlen mit unregelmäßigen Spalten ermitteln

Kann ich awkmit unregelmäßigen Spalten umgehen? Ich habe beispielsweise eine Datei wie unten, in der jede Spalte eine andere Anzahl von Werten haben kann.

Wie erhält man den Durchschnitt aller positiven Werte?

Bitte beachten Sie, dass die unvollständigen Zeilen keine Leerzeichen enthalten und Sie diese daher nicht sedzum Ersetzen dieser Leerzeichen verwenden können.

1 2 3 7
4 5
5 0
0 8 9
0

Ich weiß, wie man den Durchschnitt für normale Dateien wie unten berechnet, aber das funktioniert nicht, wenn die letzte Zeile nicht vollständig ist (4 Zahlen). Außerdem kann der folgende Code den Durchschnitt nur für jede Spalte separat drucken.

Ich brauche einen Durchschnitt für alle Zahlen ungleich Null, nicht für jede Spalte.

Wie benutzt man das awkoder pythonwie macht man das?

Meine erwartete Ausgabe ist eine Zahl:4.888888889
((1+2+3+7+4+5+5+8+9)/9=4.888888889)

awk '{for (i=1;i <= NF; i++) if ($i>0) { sum[i] += $i; num[i]++; } } END { for(i =1;i <= NF; i++) print i, sum[i]/num[i]}' $infile

Antwort1

Wenn Sie den Durchschnitt aller Zahlen in allen Spalten möchten, dann ist dies einfach

awk '   { for (i=1;i<=NF  ;i++){ sum+=$i;num++} }
     END{ print(sum/num) } ' infile

Wenn Sie den Durchschnitt pro Spalte wünschen, behalten Sie einfach die maximale Anzahl von Spalten im Auge:

awk '   {for (i=1;i<=NF  ;i++){ if(maxF<NF){maxF=NF};sum[i]+=$i;num[i]++} }
     END{for (i=1;i<=maxF;i++){ print(i,sum[i]/num[i]) } } ' infile

Antwort2

GNUawkAnsatz:

awk -v FPAT='[1-9][0-9]*' '{ n += NF; for (i=1;i<=NF;i++) sum += $i }END{ print sum/n }' file

Die Ausgabe:

4.88889

Antwort3

Ich würde die Leerzeichen in Zeilenumbrüche umwandeln und eine einzelne Zahl pro Zeile verwenden:

tr ' ' '\n' <"$infile" | awk '$1 > 0 {n++; sum+=$1} END {if (n>0) print sum/n}'

verwandte Informationen