首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Uniq元素提取

Uniq元素提取
EN

Stack Overflow用户
提问于 2012-05-24 19:35:00
回答 3查看 103关注 0票数 2

我有一个制表符分隔的文件,如下所示:

代码语言:javascript
复制
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列中的ABCA2的值应该只提取一次,这是该名称第一次出现在column1中。

所需的输出为:

代码语言:javascript
复制
ABCA2   chr9    139021506   139043195
ABCC1   chr16   15950934    16144431

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-05-24 19:39:48

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

代码语言:javascript
复制
awk '{if( !seen[$1]++ ) print }' input-file

或者,更简单地说

代码语言:javascript
复制
awk '! a[$1]++' input-file
票数 7
EN

Stack Overflow用户

发布于 2012-05-24 19:40:16

使用您在file.txt中的示例输入,uniq --check-chars=5 file.txt给出以下输出:

代码语言:javascript
复制
ABCA2 chr9 139021506 139043195
ABCC1 chr16 15950934 16144431

正如您所看到的,它仅限于比较每行的前5个字符。

编辑

正如William Pursell所指出的,uniq假定文件已经排序。另一种方法是使用sort

代码语言:javascript
复制
$ sort --key=1,1 --unique file.txt
ABCA2 chr9 139021506 139043195
ABCC1 chr16 15950934 16144431
$

一定要注意William Pursells下面的评论:对输入数据进行排序并不是解决上述问题所必需的。如果速度是一个问题/数据量很大,那么记忆seen密钥的线性解决方案(如威廉姆斯答案中的awk解析法)会更好。

票数 5
EN

Stack Overflow用户

发布于 2012-05-24 19:55:11

代码语言:javascript
复制
>>> 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10736701

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档