Um die Zahlen aus der Zeichenfolge in ein sortiertes Array zu erhalten, können Sie sie in einer separaten Zeile drucken kann jeder, Rohr sort -n
und dann ein Array lesen in mit mapfile
:
string='85 13 4 45 1111 89 87 66 1 5 2 51 13 66 98 50 20 14 18 16 31 21 5175 12'
mapfile -t arr < <(for num in $string; do echo "$num"; done | sort -n)
Die -t
Option entfernt Zeilenumbrüche von jedem Wert. Beachten Sie, dass Sie nicht können Pipe zu mapfile
, denn das wäre in einer Subshell und arr
würde danach leer sein.
Es ist normalerweise eine gute Idee, Ihre Variablen zu zitieren, aber in diesem Fall verlassen wir uns auf das Teilen von Wörtern und müssen $string
nicht zitieren.
nun für den Median, gibt es zwei Möglichkeiten:
- Es gibt eine ungerade Anzahl von Array-Elementen und wir wollen nur den Wert des mittleren Elements.
- Es gibt eine gerade Anzahl von Array-Elementen, und wir wollen den Mittelwert der zwei mittleren Elemente.
Die Anzahl der Array-Elemente ist ${#arr[@]}
, so können wir das prüfen und dann entscheiden, was zu tun ist:
auf Integer-Arithmetik
nel=${#arr[@]}
if ((nel % 2 == 1)); then # Odd number of elements
val="${arr[ $((nel/2)) ]}"
else # Even number of elements
val="$(((arr[$((nel/2))] + arr[$((nel/2-1))])/2))"
fi
printf "%d\n" "$val"
Dies beruht: Wenn wir eine ungerade Anzahl von Elementen haben, sagen drei , der Index des Medians ist 1 –, die wir von der ganzzahligen Teilung von drei durch zwei bekommen. Für eine gerade Anzahl von Elementen, sagen wir vier, wollen wir die Elemente bei Index 1 und 2, die wir erhalten, indem wir für den höheren Index jeweils vier mal zwei dividieren und für den niedrigeren Index eins davon abziehen.
Wenn sich die beiden Elemente nicht zu einer geraden Zahl addieren, wird das Ergebnis abgerundet.Wenn das nicht gut genug ist, können wir entweder überprüfen, ob die Zahl ungerade ist, und manuell .5
zum Ergebnis hinzufügen, oder wir können bc
verwenden, um die Berechnung durchzuführen. Überlegen Sie:
$ echo $((11/2))
5
$ bc <<< 'scale=1; 11/2'
5.5