计算分组线的平均值

时间:2016-01-15 18:30:18

标签: awk mean

我有一组文件,其中包含以下信息:

 ID      Score    Other
 ABR     0.98     NBNMSB
 BCG     0.76     NBNMSB
 CVD     0.6      NBNMSB
 BCG     0.9      VSCVA
 CVD     0.56     VSCVA
 ABR     0.9      VSCVA
 CVD     0.7      BAVSC
 BCG     0.4      BAVSC
 ABR     0.5      BAVSC
 ABR     0.8      NBNMSB
 BCG     0.6      NBNMSB
 CVD     0.3      NBNMSB
 BCG     0.7      VSCVA
 CVD     0.0      VSCVA
 ABR     0.1      VSCVA
 CVD     0.5      BAVSC
 BCG     0.8      BAVSC
 ABR     1.0      BAVSC

我想计算第一列的得分最大值,即每个第三列的ID,以便结果按第一列分组,并计算第三列得分的最大值,如下所示:

档案ABR.txt

 ABR     0.98    NBNMSB
 ABR     0.9     VSCVA
 ABR     1.0     BAVSC

文件BCG.txt

 BCG     0.76     NBNMSB
 BCG     0.9      VSCVA
 BCG     0.8      BAVSC

和CVD相同,因为文件非常大且有多个这样的文件,目前我正在使用以下代码:

读取ID时

;执行

 while read line; do
  block=$(echo $line | awk '{print $1}')
  max_of_score=$(grep $block Negative/fileofinterest*.ext | grep $ID | awk 'BEGIN {max = 0} {if ($2>max) max=$2} END {print max}')
  echo $block $max_of_score >> $ID"_max.txt"
 done < fileOfcolumn3values.txt
 #contains all the possible values of column 3 (in this case NBNMSB, VSCVA, BAVSC)
done < fileOfIdscolumn1.txt
#contains all possible values of column 1 (in this case ABR, BCG, CVD)

我想找到一个比上述算法TIA

更快的代码

1 个答案:

答案 0 :(得分:1)

您可以在awk

中完全执行此操作
awk '{
     if (($1, $3) in a)
     {
      if ($2 > a[$1, $3]) a[$1, $3] = $2
     } 
     else a[$1, $3] = $2
     };
    END
    {
    for (x in a)
    {
     split(x, b, SUBSEP); print b[1], a[x], b[2] > b[1]".txt"
    }
    }' file

这会生成

cat ABR.txt
ABR 1.0 BAVSC
ABR 0.98 NBNMSB
ABR 0.9 VSCVA

等等