2

次のようなタブ区切りファイルがあります。

ABCA2   chr9    139021506   139043195
ABCA2   chr9    139021506   139042561
ABCC1   chr16   15950934    16144431
ABCC1   chr16   15950934    16144431
ABCC1   chr16   15950934    16144431
ABCC1   chr16   15950934    16144431

列 2、3、および 4の値のように、 column に基づいて値を抽出したいのですがABCA2、列 1 で名前が最初に出現するのは 1 回だけです。

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

ABCA2   chr9    139021506   139043195
ABCC1   chr16   15950934    16144431

ありがとうございました

4

3 に答える 3

7

問題の記述はあいまいですが、最初の列のエントリがまだ表示されていない場合にのみ行を出力することを意味すると解釈しています。pythonawk は明らかに適切なツールであるため、これがタグ付けされている理由はわかりません。

awk '{if( !seen[$1]++ ) print }' input-file

または、より簡単に

awk '! a[$1]++' input-file
于 2012-05-24T11:39:47.640 に答える
5

の入力例を使用すると file.txt、次のuniq --check-chars=5 file.txt出力が得られます。

ABCA2 chr9 139021506 139043195
ABCC1 chr16 15950934 16144431

ご覧のとおり、各行の最初の 5 文字のみの比較に限定されています。

編集

William Pursell が指摘したようにuniq、ファイルが既にソートされていることを前提としています。別の方法は、次を使用することsortです。

$ sort --key=1,1 --unique file.txt
ABCA2 chr9 139021506 139043195
ABCC1 chr16 15950934 16144431
$

以下のWilliam Pursells のコメントに注意してください:入力データの並べ替えは、問題を解決するために厳密に必要というわけではありません。速度が懸念される場合/データ量が多い場合は、見たキーを記憶する線形ソリューション (awkウィリアムズの回答のソウルションなど) の方が優れています。

于 2012-05-24T11:40:16.217 に答える
1
>>> d = {}
>>> with open('f.txt') as f:
...    for line in f.readlines():
...        x = line.split()
...        if x[0] not in d.keys():
...           d[x[0]] = x[1:]
...
>>> for k,v in d.iteritems():
...    print k,' '.join(v)
...
ABCA2 chr9 139021506 139043195
ABCC1 chr16 15950934 16144431
于 2012-05-24T11:55:11.003 に答える