如何只打印具有唯一字段的行?

时间:2011-09-29 19:06:39

标签: python bash unique

例如......如果我有这样的文件:

A   16  chr11   36595888
A   0   chr1    155517200
B   16  chr1    43227072
C   0   chr20   55648508
D   0   chr2    52375454
D   16  chr2    73574214
D   0   chr3    93549403
E   16  chr3    3315671

我只需要打印具有唯一第一列的行:

B   16  chr1    43227072
C   0   chr20   55648508
E   16  chr3    3315671

它与awk '!_[$1]++'类似,但我想删除所有具有非唯一拳头字段的行。

最好使用Bash和python解决方案。

6 个答案:

答案 0 :(得分:7)

在bash中,假设第一列已修复为(3):

sort input-file.txt | uniq -u -w 3

' - u'选项仅打印唯一的行,' - w 3'比不会超过前3个字符。

答案 1 :(得分:3)

这个怎么样:

#!/usr/bin/env python
from collections import defaultdict
data = defaultdict(list)
with open('file', 'rb') as f:
    for line in sorted(f.readlines()):
        data[line[0]].append(line)
for key in sorted(data.iterkeys()):
    if len(data[key]) == 1:
        print data[key]

答案 2 :(得分:1)

awk '
  {count[$1]++; line[$1]=$0}
  END {for (val in count) if (count[val]==1) print line[val]}
' filename

这可能会改变行的顺序。如果这是一个问题,请尝试这种2遍方法:

awk '
  NR==FNR {count[$1]++; next}
  count[$1] == 1 {print}
' filename filename

答案 3 :(得分:1)

sed one liner solution:

sed ':a;$bb;N;/^\(.\).*\n\1[^\n]*$/ba;:b;s/^\(.\).*\n\1[^\n]*\n*//;ta;/./P;D' file

答案 4 :(得分:0)

在python中

,更容易阅读和调整:

d = dict()
for line in open('input-file.txt', 'r'):
  key = line.split(' ', 1)[0]
  d.setdefault(key, list()).append(line.rstrip())

for k, v in sorted(d.items()):
  if len(v) == 1:
     print v[0]

答案 5 :(得分:0)

import sys
from collections import OrderedDict
lines = OrderedDict()
for line in sys.stdin:
    field0 = line.strip().split('\t')[0]
    lines[field0] = None if field0 in lines else line
for line in lines.values():
    if line is not None:
        sys.stdout.write(line)

如果您不关心保留订单,可以使用普通旧词典({})代替OrderedDict

此实现并不关心重复字段是否相邻。