根据另一列中的变量名称选择列中的顶部值

时间:2015-01-29 01:50:41

标签: perl unix awk

我正在尝试根据另一列中的变量/字段选择列中的顶部值。它是一个非常大的制表符分隔文件。

输入:

Names col2 col3 col4  
A    A1   def  10  
A    A1   BBB  10  
A    A1   CED  10  
A    A1   fff  7.5  
B    B1   def  7.5  
B    B1   dff  5.5  
B    B1   fff  4.5  
C    C1   ggg  6.5  
C    C3   iii  6.5  
C    C2   hhh  5.0  
C    C4   toi  6.5  
D    D1   xyz  10.0  
D    D2   ikj  7.5  
D    D3   abc  7.5  
...  

输出

Names col2 col3 col4  
A    A1   def  10  
A    A1   BBB  10  
A    A1   CED  10  
B    B1   def  7.5  
C    C1   ggg  6.5  
C    C3   iii  6.5  
C    C4   toi  6.5  
D    D1   xyz  10.0  

基本上,我想要所有值为10的行和column1中每个名称的最高值。任何通过perl,awk或sed解决这个问题的输入都很受欢迎 感谢。

1 个答案:

答案 0 :(得分:0)

我已经尝试了以下代码,该代码可以工作并获取结果

#!/bin/sh

for col1 in `grep -v "Names" <filename> |awk '{print $1}'|sort|uniq`;
 do 
     maxVal=$(awk -v x=$col1 '$1 == x {print $4}' <filename> |sort|uniq|head -1);
    awk -v names=$col1 -v max=$maxVal '$1 == names && $4 == max {print $0 }' <filename>
done

产生如下结果

A    A1   def  10  
A    A1   BBB  10  
A    A1   CED  10  
B    B1   fff  4.5  
C    C2   hhh  5.0