2017-04-22 277 views
0

我想從我的bash shell腳本中的文件計算每行的中位數。我相信有一種方法可以通過使用流水線的cut,sort,head和tail命令來實現這一點,但我無法弄清楚如何將這個過程集成到我現有的代碼中。我想在計算平均值的同一點計算中位數。做這個的最好方式是什麼?如何計算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

「什麼是做這件事的最好方法嗎?「 - 可能不在shell腳本中:-) –

+0

嘗試在這裏搜索「[awk] average」。我看到600多個Q/A。祝你好運。 – shellter

回答

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不適合此任務。

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