bash - 在一行BASH中获取未排序数组的中位数

标签 bash median

我还没有找到任何简单的实现来查找数组的中位数。 bash 如何在不重新发明轮子的情况下做到这一点?

如果当前正在使用这个:

median() {
  arr=$1
  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"
}

出于某种原因,我仍然无法弄清楚,它返回的值不正确,对于如此简单的事情来说,它似乎过于复杂。我觉得必须有一种方法可以在一行中完成此操作。

最佳答案

我想你想要这样的东西:

#!/bin/bash
median() {
  arr=($(printf '%d\n' "${@}" | sort -n))
  nel=${#arr[@]}
  if (( $nel % 2 == 1 )); then     # Odd number of elements
    val="${arr[ $(($nel/2)) ]}"
  else                            # Even number of elements
    (( j=nel/2 ))
    (( k=j-1 ))
    (( val=(${arr[j]} + ${arr[k]})/2 ))
  fi
  echo $val
}

median 1
median 2 50 1
median 1000 1 40 50

示例输出

1
2
45

关于bash - 在一行BASH中获取未排序数组的中位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750008/

相关文章:

python - 当 inf 存在时, np.percentile 返回与 np.median 不同的中位数

bash - Dockerfile CMD 指令将在运行后立即退出容器

linux - 命令中意外标记 `fi' 附近存在语法错误

bash - 如何在第 n 个分隔符处拆分字符串?

ios - iOS的中值过滤器

algorithm - 从列表中删除元素时更新中位数

Java在子串中找到两个中位数

bash - 如何将带双引号的空字符串传递给 bash 脚本?

linux - 使用标准 shell 构建自定义应用程序特定的 shell

c - 二维数组中值滤波