提取两个单独列范围的最大值,并使用Bash脚本计算方差

时间:2017-09-06 14:43:25

标签: bash awk

我是一个初学者,试图用awk解决bash脚本问题,我有这个当前的问题,下面有示例数据:

label1  0   0   0   0   0   1
label2  0   0   0   0   0   1
label3  0.2 0.2 0.9 0   0   0
label4  0   0   0.8 0.1 0   0
label5  0.1 0.1 0.1 0.15    0.1 0.1
label6  0.1 0.15    0.1 0.1 0.1 0.1

第1列是行的标题,第2列到第7列是数值。

我目前正在尝试使用awk(对任何其他建议开放)为每个新行输出一个包含4列的新文件:

label1  0   1   0.166666667
label2  0   1   0.166666667
label3  0.9 0   0.121666667
label4  0.8 0.1 0.103
label5  0.1 0.15    0.000416667
label6  0.15    0.1 0.000416667

其中:
第1列是输入
第1列 第2列是来自输入
的第2列到第4列的最大值 第3列是来自输入
的第5列到第7列的最大值 第4列是第2列到第7列的方差

非常感谢您的建议和帮助(和时间)!

KS

1 个答案:

答案 0 :(得分:0)

awk救援!

awk 'function max(x,y) {return x>y?x:y}
     function mean(is,ie) {s=0; for(i=is;i<=ie;i++) s+=$i;        return s/(ie-is+1)}
     function var(is,ie,m) {v=0; for(i=is;i<=ie;i++) v+=($i-m)^2; return v/(ie-is)}

     {print $1, max(max($2,$3),$4), max(max($5,$6),$7), var(2,7,mean(2,7))}' file | 
column -t

label1  0     1     0.166667
label2  0     1     0.166667
label3  0.9   0     0.121667
label4  0.8   0.1   0.103
label5  0.1   0.15  0.000416667
label6  0.15  0.1   0.000416667

备注

  

计算“样本差异”

     

您可能希望使用printf

格式化数字      

对于大型脚本,您可能希望在函数等中隔离变量名称。