我有一个制表符分隔的文件,如下所示:
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中。
所需的输出为:
ABCA2 chr9 139021506 139043195
ABCC1 chr16 15950934 16144431谢谢
发布于 2012-05-24 19:39:48
您的问题的陈述是模棱两可的,但我将其解释为,如果尚未看到第一列中的条目,则只希望输出一行。我不知道为什么它被标记为python,因为awk显然是正确的工具:
awk '{if( !seen[$1]++ ) print }' input-file或者,更简单地说
awk '! a[$1]++' input-file发布于 2012-05-24 19:40:16
使用您在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下面的评论:对输入数据进行排序并不是解决上述问题所必需的。如果速度是一个问题/数据量很大,那么记忆seen密钥的线性解决方案(如威廉姆斯答案中的awk解析法)会更好。
发布于 2012-05-24 19:55:11
>>> 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 16144431https://stackoverflow.com/questions/10736701
复制相似问题