2017-08-06 31 views
1

everyone!删除重复项并保留包含来自一列的最大值的行 - LINUX

我想删除重复项,并保留具有4个字段的文件中的一列(第4列)中的最高值的行。我必须在Linux服务器上执行此操作。

之前

gene subj e-value ident 
    g1 h1 0.05 75.5 
    g1 h2 0.03 60.6 
    g2 h7 0.00 80.5 
    g2 h9 0.00 50.3 
    g2 h4 0.03 90.7 
    g3 h5 0.10 30.5 
    g3 h8 0.00 76.8 
    g4 h11 0.00 80.7 

gene subj e-value ident 
    g1 h1 0.05 75.5 
    g2 h4 0.03 90.7 
    g3 h8 0.00 76.8 
    g4 h11 0.00 80.7 

太感谢你了,我很抱歉,如果我问重复的东西!但是我没有为我的问题找到答案。

+2

什么具有u试过吗? – tso

+0

我试过基于awk的命令,如'cat blast_selected_split0_outfmt6.txt | awk -F'\ t''{if($ 1 $ 3 in a){if($ 7> a [$ 1 $ 3]){a [$ 1 $ 3] = $ 7; r [$ 1 $ 3] = $ 0;}} else if($ 3 $ a 1){if($ 7> a [$ 3 $ 1]){a [$ 3 $ 1] = $ 7; r [$ 3 $ 1] = $ 0;}} else {a [$ 1 $ 3] = $ 7; r [$ 1 $ 3] = $ 0;}} END {for(x in r)print r [x]}'' –

+0

但是它保留了重复的 –

回答

2

你可以试试这个,如果没有问题,得到的输出没有标题:

tail -n +2 file.txt | sort -k1,1 -k4,4rn | sort -uk1,1 

说明:

tail -n +2 file.txt 

将去除头,使他们不参与所有排序得到。

sort -k1,1 -k4,4rn 

将由1列的第一(-k1,1)进行排序,然后通过在数值列4和以相反的顺序(-k4,4rn

最后:

sort -uk1,1 

将删除重复考虑到刚第一列。

请注意,-k1,1表示从第1列到第1列,因此-k4,4从第4列到第4列。调整以适合您的列。

+0

非常感谢!重复被删除,但它没有在第7列中获得最大价值。实际上,我的文件比示例大(它有7列),我简化为4列文件。所以我使用了这个命令:'tail -n +2 file.txt | sort -k1,1 -k4,4rn | sort -uk1,1'。有什么不对? –

+0

@ M.Sobreiro更新了我的答案以添加解释,希望它对您有所帮助。我认为你想要的是'tail -n +2 file.txt | sort -k1,1 -k7,7rn | sort -uk1,1' – archemiro

+0

感谢您的关注和帮助! –

0

随着GNU datamash工具:

datamash --headers -Wfs -g1 max 4 < file | cut -f1-4 

输出:

gene subj e-value ident 
g1 h1 0.05  75.5 
g2 h4 0.03  90.7 
g3 h8 0.00  76.8 
g4 h11 0.00  80.7 
+0

谢谢!我会尽力!! –

0

一个awk解决方案,但为了简单起见,我喜欢archimiro版本。

awk ' 
    NR>1 && $1 in arr { 
     if ($4 > arr[$1][4]) 
      split($0, arr[$1]) 
     next 
    } 

    NR>1 { 
     arr[$1][1] = "" 
     split($0, arr[$1]) 
    } 

    END { 
     for(i in arr) { 
      for(j in arr[i]) 
       printf arr[i][j] "\t" 
      print "" 
     } 
    } 
' data.file 

结果:

g1 h1 0.05 75.5  
g2 h4 0.03 90.7  
g3 h8 0.00 76.8  
g4 h11 0.00 80.7  
+0

非常感谢你! –

相关问题