【问题标题】:select top values in a column based on the variable name in another column根据另一列中的变量名称选择列中的最高值
【发布时间】:2015-03-28 03:33:36
【问题描述】:

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

输入:

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 解决此问题的输入。
谢谢。

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow!如果您在此处询问之前努力寻找解决方案,我们更愿意。你能告诉我们你的尝试吗?
  • 我是生物信息学的初学者。我尝试将 perl 与 while 循环和 If $_[3] > "10" 一起使用。我停在那里,因为我不知道如何根据每个名称的最高值进行选择。
  • 您应该向我们展示代码,我们可以提供帮助。

标签: perl unix awk


【解决方案1】:

我已经尝试了下面的代码并获取了结果

#!/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

【讨论】:

    猜你喜欢
    • 2014-10-05
    • 2023-03-23
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 2018-01-02
    相关资源
    最近更新 更多