0

我的数据表如下所示:

chr4    124097568       124098568       337
chr4    159597106       159598106       1000   
chr4    159597106       159598106       1000 
chr4    164361532       164362532       455
chr4    164361532       164362532       74
chr4    164361532       164362532       2
chr4    170360150       170361150       0

我想:提取唯一行 - 如果 col#2 和 col#3 中的数据相同 -> 应该只提取最高值 (col#4) 行。如果 #2,#3 & #4 相同,则应提取其中一行。

首选输出是:

chr4    124097568       124098568       337
chr4    159597106       159598106       1000 
chr4    164361532       164362532       455
chr4    170360150       170361150       0

如果有不清楚的地方,我会尝试更多地解释它(因为我现在真的需要解决这个问题)。

4

5 回答 5

3
$ cat example.txt
chr4    124097568       124098568       337
chr4    159597106       159598106       1000   
chr4    159597106       159598106       1000 
chr4    164361532       164362532       455
chr4    164361532       164362532       74
chr4    164361532       164362532       2
chr4    170360150       170361150       0

$ sort --key=2 -g -u example.txt 
chr4    124097568       124098568       337
chr4    159597106       159598106       1000   
chr4    164361532       164362532       455
chr4    170360150       170361150       0
于 2012-04-13T19:30:09.667 回答
1

如果最后一列(COL#4)是“右空格填充”,那会更容易,如下所示:

chr4    124097568       124098568        337
chr4    159597106       159598106       1000   
chr4    159597106       159598106       1000 
chr4    164361532       164362532        455
chr4    164361532       164362532         74
chr4    164361532       164362532          2
chr4    170360150       170361150          0

这样, sort 和 uniq 的组合就可以解决问题。

于 2012-04-13T19:22:26.633 回答
1
awk '
    {key = $2 SUBSEP $3}
    !(key in max) || $4 > max[key] {max[key]=$4; line[key]=$0}
    END {for (key in line) print line[key]}
'
于 2012-04-13T19:47:22.840 回答
1

这可能对您有用:

 sort -k4nr file | sort -uk2,3n
于 2012-04-13T20:59:03.893 回答
0

一种可能的解决方案是对输入的行进行排序,然后终止多次出现的行。在 Python 中,您可以执行类似的操作

f = open("table.dat", "r")
lines = f.read().split()
lines.sort()

old = lines[0]
singles = [old]
for line in lines:
    if old != line:
        singles.append(line)
        old = line
    else:
        pass

f.close()

我不知道如何在 bash 中执行此操作。

最好的问候,斯文

于 2012-04-13T19:32:02.000 回答