
Kann ich awk
mit 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 sed
zum 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 awk
oder python
wie 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
GNUawk
Ansatz:
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}'