如何在bash shell脚本中计算文件中每行的中位数

时间:2017-04-22 03:21:19

标签: linux bash shell

我正在尝试从bash shell脚本中的文件计算每行的中位数。我相信有一种方法可以通过使用切换,排序,头部和尾部的流水线命令来实现这一点,但我无法弄清楚如何将此过程集成到我现有的代码中。我想在计算平均值的同一点计算中位数。这样做的最佳方式是什么?

while read i
do
    sum=0
    count=0
    mean=0
    median=0
    for num in $i
    do
        sum=$(($sum + $num))
        count=`expr $count + 1`
        mean=`expr $sum / $count`
        #Need to calculate the median
    done
    echo "Sum: $sum Mean: $mean"
done < $2

2 个答案:

答案 0 :(得分:2)

awk救援!

awk '{sum=0; 
      n=split($0,a); 
      for(i=1;i<=n;i++) sum+=a[i]; 
      asort(a); 
      median=n%2?a[n/2+1]:(a[n/2]+a[n/2+1])/2; 
      print sum, sum/n, median}' file

bash不适合执行此任务。

答案 1 :(得分:2)

假设行长度可变:

  1. 使用bashdatamash

    while read x
    do    tr -s '\t' '\n' <<< "$x" | \
          datamash  median 1
    done < file
    
  2. 使用numaverage

    while read x
    do    tr -s '\t' '\n' <<< "$x" | \
          numaverage -M
    done < file