我的数据表如下:
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
如果某些事情不明确,我会尝试解释一下(因为我现在真的需要解决这个问题)。
答案 0 :(得分: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
答案 1 :(得分: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的组合可以解决问题。
答案 2 :(得分: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]}
'
答案 3 :(得分:1)
这可能对您有用:
sort -k4nr file | sort -uk2,3n
答案 4 :(得分: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中执行此操作。
祝你好运, 斯文