Mittelwert, Median und Varianz, diese Kenngrößen von Messwerten brauchte ich. Da ich sowieso im Terminal unterwegs war schrieb ich mir schnell diese (teilweise ineinandergreifenden) Skripte zusammen - und schrieb sie selbst, weil die Messwerte aus negativen und Kommazahlen bestanden (und ich auf die schnelle keine damit zurechtkommende Implementierung fand).
Mittelwertmittelwert.sh#!/bin/bash
#Calculate the mean of the arguments
#Formula: sum_1_to_n(x_i)/n
if [[ $# -eq 0 ]];then
echo "No arguments found. Exiting." >&2
exit 1
fi
sum=0
n="$#"
while [[ "$#" -gt 0 ]];do
value="$1"
sum=$(echo "$sum + $value" | bc -l)
shift
done
echo "$sum / $n" | bc -lMedianmedian.sh
#!/bin/bash
#Calculate the median of the arguments
#Formula: Var(X)=x_(n/2) if n even
# Var(X)=x_((n+1)/2) else
if [[ $# -eq 0 ]];then
echo "No arguments found. Exiting." >&2
exit 1
fi
sorted_args=($(sort.pl $*))
n="$#"
if [[ $((n%2)) -eq 0 ]];then
mid=$((n / 2))
else
mid=$(( (n+1) / 2))
fi
mid=$((mid-1))
echo ${sorted_args[$mid]}sort.pl#!/usr/bin/perl
#Sort given arguments
use strict;
use warnings;
my @sorted_numbers = sort {$a $b} @ARGV;
print "@sorted_numbers\n";Für den Median habe ich Perl zuhilfe genommen, statt einen Sortieralgorithmus selbst zu implementieren. sort -n kam mit den negativen Kommazahlen nicht zurecht.
Varianzvarianz.sh#!/bin/bash
#Calculate the sample variance (empiristische Varianz) of the arguments
#Formula: (1/n-1)*(sum_1_to_n(x_i²)-n*mittelwert(X)²)
if [[ $# -eq 0 ]];then
echo "No arguments found. Exiting." >&2
exit 1
fi
n="$#"
mittelwert=$(mittelwert.sh $*)
factor=$(echo "1 / ($n -1)" | bc -l)
sum=0
for i in $*;do
sum=$(echo "$i*$i+$sum" | bc -l)
done
echo "$factor*($sum-($n*($mittelwert*$mittelwert)))" | bc -l