首页 > 解决方案 > 获取每一行的最高绝对值(awk)

问题描述

我有一个文件,其中包含多个行和列选项卡分隔,例如:

ID    v1        v2      v3     v4      v5     v6
A10  -0.2134  -0.190  -0.114  0.400  10.678 -0.123  
A115 -0.5038  -0.559  -0.664  0.431   0.139 -0.860    
AAAS -0.9072  -0.990  -1.251  3.153  -0.756  0.674 

我想从每一行中获取最大的绝对数并打印是负数还是正数,并从对应的列中打印标题 ID,例如:

A10   10.678 v5  
A115  -0.860 v6    
AAAS  3.153  v4 

我能够计算每一行的最小值和最大值,但我不确定如何获得最高的绝对值和 ID:

 awk  'NR>1{a=0; b=0; for (i=1;i<=NF;i++) if ($i < a || i == 1)a = $i; else if($i > b|| i == 1)b = $i; print $1,a, b}' file

A10  -0.2134  10.678
A115 -0.860   0.431
AAAS -1.251   3.153

标签: unixawkmax

解决方案


差不多一样

$ awk 'function abs(x) {return x>0?x:-x} 
       NR==1 {split($0,h); next} 
             {max=abs($2); mi=2; 
              for(i=3;i<=NF;i++) 
                if(max<(nm=abs($i))) 
                  {max=nm; mi=i}; 
              print $1,$mi,h[mi]}' file | column -t 

A10   10.678  v5
A115  -0.860  v6
AAAS  3.153   v4

推荐阅读