首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Awk:删除带条件的重复行

Awk:删除带条件的重复行
EN

Stack Overflow用户
提问于 2011-09-30 18:51:19
回答 2查看 744关注 0票数 1

我有一个以制表符分隔的8列文本文件:

代码语言:javascript
复制
Erythropoietin Receptor Integrin Beta 4 11.7    9.7 164 195 19  3.2
Erythropoietin Receptor Receptor Tyrosine Phosphatase F 10.8    2.6 97  107 15  3.2
Erythropoietin Receptor Leukemia Inhibitory Factor Receptor 12.0    3.6 171 479 14  3.2
Erythropoietin Receptor Immunoglobulin 9    10.4    3.1 100 108 24  3.3
Erythropoietin Receptor Collagen Alpha 1 Xx 10.7    2.7 93  105 18  3.3
Tumor Necrosis Factor Receptor  Tumor Necrosis Factor Receptor 5    11.4    3.2 114 114 25  1.7
Tumor Necrosis Factor Receptor  Tumor Necrosis Factor Receptor 14   11.1    2.1 99  100 28  1.8
Tumor Necrosis Factor Receptor  Tumor Necrosis Factor Receptor 1B   10.9    4.9 133 162 29  1.9
Tumor Necrosis Factor Receptor  Tumor Necrosis Factor Receptor 11A  11.5    5.1 130 166 25  1.9

第一列和第二列包含蛋白质名称,第八列包含每个蛋白质对之间的“距离”分数。我想删除包含重复蛋白质对的行,只保留距离最小的对(第8列中的最低值)。这意味着对于蛋白A-蛋白B对,除了距离得分最低的那一个之外,我想删除所有的出现。即使蛋白质名称被交换(在不同的列中),这对蛋白质也被认为是重复的。这意味着蛋白A蛋白B与蛋白B蛋白A是相同的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-09-30 20:17:27

我希望这将是最终的更新^_^

代码语言:javascript
复制
kent$  awk -F'\t' '{if($1$2 in a){
                if($8<a[$1$2]){
                        a[$1$2]=$8;r[$1$2]=$0;
                }
        }else if ($2$1 in a){
                if($8<a[$2$1]){
                        a[$2$1] = $8;r[$2$1] = $0;
                }
        }else{
                a[$1$2]=$8; r[$1$2]=$0;
        }
} END{for(x in r)print r[x]}' yourFile
票数 1
EN

Stack Overflow用户

发布于 2011-09-30 19:14:27

类似于以下内容(未经测试):

代码语言:javascript
复制
awk -F'\t' 'END {
  for (r in rec) print rec[r] 
  }
{
  if (mina[$1, $2] < $NF || minb[$2, $1] < $NF) {
    mina[$1, $2] = $NF; minb[$2, $1] = $NF
    rec[$1, $2] = $0
    }  
  }' infile
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7609337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档