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 が同一の場合、行の 1 つだけを抽出する必要があります。

好ましい出力は次のとおりです。

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

考えられる解決策の1つは、入力の行を並べ替えてから、複数回発生する行を強制終了することです。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 に答える