Bash - 根据具体特征从表中提取信息

时间:2012-04-13 19:17:08

标签: bash

我的数据表如下:

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

如果某些事情不明确,我会尝试解释一下(因为我现在真的需要解决这个问题)。

5 个答案:

答案 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中执行此操作。

祝你好运, 斯文