As said
choroba, you can use
sort(1), then remove the first two and last two integers.
Here is my code:
Code:
#!/bin/bash
nbrs=(
18562 18252 17862 18005
18480 17972 18166 17592
16851 19705 17667 17553
18434 17496 19712 17484
16916 17659 17829 18287
)
nbrs_size=${#nbrs[@]}
nbrs=( $(printf '%s\n' "${nbrs[@]}" | sort) )
unset 'nbrs[0]' 'nbrs[nbrs_size - 1]' \
'nbrs[1]' 'nbrs[nbrs_size - 2]'
bc <<< "scale = 2; ($(IFS=+; echo "${nbrs[*]}")) / ($nbrs_size - 4)"
----
dynacade wrote:
[...] I was hoping there was some secret bash magic out there that could do this succinctly.
Not really, but you can implement a sorting algorithm, e.g. Bubble sort,
if you want to make it almost
bash(1) only.
Code:
#!/bin/bash
sort_array()
{
# usage: sort_array <array_size> <array>
if ((! $#)); then
return 1
fi
local arr_size=$1
shift
set -f; local arr=($@); set +f
local _permut=1 _tmp i
while ((_permut)); do
_permut=0
for ((i = 0; i < arr_size - 1; i++)); do
if ((arr[i + 1] < arr[i])); then
_tmp=${arr[i]}
arr[i]=${arr[i + 1]}
arr[i + 1]=$_tmp
_permut=1
fi
done
done
echo "${arr[@]}"
}
nbrs=(
18562 18252 17862 18005
18480 17972 18166 17592
16851 19705 17667 17553
18434 17496 19712 17484
16916 17659 17829 18287
)
nbrs_size=${#nbrs[@]}
values=$(sort_array $nbrs_size "${nbrs[@]}")
values=${values#*[[:blank:]]*[[:blank:]]}
values=${values%[[:blank:]]*[[:blank:]]*}
bc <<< "scale = 2; (${values//[[:blank:]]/+}) / ($nbrs_size - 4)"
It'll be slower, though.