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

我想根据 column 提取值,例如第ABCA22,3 列和 4 中的值应该只提取一次,这是名称第一次出现在 column1 中。

理想的输出是:

ABCA2   chr9    139021506   139043195
ABCC1   chr16   15950934    16144431

谢谢

4

3 回答 3

7

您的问题的陈述是模棱两可的,但我将其解释为您只希望在尚未看到第一列中的条目时输出一行。我不知道为什么要标记它python,因为 awk 显然是正确的工具:

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

或者,更简单地说

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

使用您的示例输入 file.txtuniq --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 回答