我正在尝试从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
答案 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)
假设行长度可变:
使用bash
和datamash
:
while read x
do tr -s '\t' '\n' <<< "$x" | \
datamash median 1
done < file
使用numaverage
:
while read x
do tr -s '\t' '\n' <<< "$x" | \
numaverage -M
done < file