如何删除重复行并仅为具有分数的基因列表保留最高值

时间:2018-03-18 18:09:18

标签: r bash awk

我有一个20k行的三列表。第1列:基因ID列表(可能有重复的ID) 第二列:常数字符串
第3列:值
我想要的是对我的列表进行排名,只留下唯一的基因ID。对于重复的基因ID,我想只留下得分最高的那些。

这里有一个例子,提前致谢

TMCS09g1008699  ensembl 6.4
TMCS09g1008671  ensembl 6.4
TMCS09g1008672  ensembl 6.5
TMCS09g1008673  ensembl 6
TMCS09g1008674  ensembl 5.4
TMCS09g1008675  ensembl 5.4
TMCS09g1008676  ensembl 4.9
TMCS09g1008677  ensembl 4.6
TMCS09g1008677  ensembl 4.4
TMCS09g1008679  ensembl 4.3
TMCS09g1008680  ensembl 3.9
TMCS09g1008681  ensembl 3.8
TMCS09g1008682  ensembl 3.6
TMCS09g1008683  ensembl 3.5
TMCS09g1008684  ensembl 3.5
TMCS09g1008685  ensembl 3.4
TMCS09g1008686  ensembl 3.4
TMCS09g1008687  ensembl 3.4
TMCS09g1008688  ensembl 3
TMCS09g1008689  ensembl 2.6
TMCS09g1008690  ensembl 2
TMCS09g1008699  ensembl 5.9

3 个答案:

答案 0 :(得分:2)

您可以使用k3

n

第一个排序按第三列(r)按降序(Codable)对文件进行排序({ "status": "success", "data": { "time": "00:02:00", "employees": [ { "id": 001, "name": "foo" }, { "id": 002, "name": "bar" } ] } } ),第二个排序根据第一列取消输出

答案 1 :(得分:0)

您能否请关注awk并告诉我这是否对您有所帮助。

awk '{b[$1]=a[$1]>$NF?b[$1]?b[$1]:$0:$0;a[$1]=a[$1]>$NF?a[$1]:$NF;} END{for(i in a){print b[i]}}'  Input_file

现在也添加非单线形式的解决方案。

awk '
{
  b[$1]=a[$1]>$NF?b[$1]?b[$1]:$0:$0;
  a[$1]=a[$1]>$NF?a[$1]:$NF}
END{
  for(i in a){
    print b[i]}
}
'  Input_file

答案 2 :(得分:0)

您可以使用awk:

  • 将每个基因ID的最高得分存储在一个数组中
    • 扫描输入
    • 如果分数高于之前的分数,请将其替换为
  • 最后,打印数组的内容

这是一种方法:

awk '{ m[$1] = m[$1] > $3 ? m[$1] : $3; } END { for (i in m) print i, "ensembl", m[i] }' file

如果您希望看到按基因ID排序的输出,那么只需将上面的awk传递给sort