Linux 从值字符串中获取中值

Linux 从值字符串中获取中值,linux,string,bash,sorting,median,Linux,String,Bash,Sorting,Median,我需要找到保存在字符串中的值的中间值。我必须在没有任何额外临时文件的情况下在bash中实现这一点,并且我不能使用awk 我已将此字符串保存在$string中: 首先,我需要对这些值进行如下排序: 1 2 4 5 12 13 13 14 16 18 20 21 31 45 50 51 66 66 85 87 89 98 1111 5175 然后我需要找到这些值的中间值 (21+31) / 2 = 26 我怎样才能做到这一点?bash中有没有有效的方法或命令 我的想法是: 要对值进行排序,我可以

我需要找到保存在字符串中的值的中间值。我必须在没有任何额外临时文件的情况下在bash中实现这一点,并且我不能使用awk

我已将此字符串保存在$string中:

首先,我需要对这些值进行如下排序:

1 2 4 5 12 13 13 14 16 18 20 21 31 45 50 51 66 66 85 87 89 98 1111 5175
然后我需要找到这些值的中间值

(21+31) / 2 = 26
我怎样才能做到这一点?bash中有没有有效的方法或命令

我的想法是:

要对值进行排序,我可以使用sort,但我不确定如何强制它对字符串中的值进行排序,因为它使用的是FILE


但我不知道如何实现中值,因此我希望至少有一些小提示。

您可以使用以下命令:

str="85 13 4 45 1111 89 87 66 1 5 2 51 13 66 98 50 20 14 18 16 31 21 5175 12"
count=$(echo $str | wc -w)
arr=($(echo $str | tr " " "\n" | sort -n ))
#echo ${arr[*]}

if [[ $(( $count % 2 )) == 0 ]]; then 
    # even element count, get the elements around the middle
    f1=${arr[ $(( (count - 1 ) /2 )) ]}
    f2=${arr[ $(( (count + 1 ) /2 )) ]}
    #echo "f1=$f1, f2=$f2"
    echo $(( ($f1 + f2) / 2 )) 
else
    # odd element count
    echo ${arr[ $(( $count / 2 ))]}
fi

要将字符串中的数字输入到已排序的数组中,您可以将它们分别打印在单独的一行上,通过管道连接到sort-n,然后使用mapfile读取到数组中:

这依赖于整数算术:如果我们有奇数个元素,比如说三个,中位数的指数是1——我们从三除以二的整数中得到。对于偶数个元素,比如说四个,我们需要索引1和2处的元素,我们通过对较高的索引除以四除以二,对较低的索引减去一得到

如果这两个元素加起来不是偶数,则结果将向下舍入。如果这还不够好,我们可以检查数字是否为奇数并手动将.5添加到结果中,或者我们可以使用bc进行计算。考虑:

$ echo $(( 11/2 ))
5
$ bc <<< 'scale=1; 11/2'
5.5
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)
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"
$ echo $(( 11/2 ))
5
$ bc <<< 'scale=1; 11/2'
5.5