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

Python 如何仅打印具有唯一字段的行?,python,bash,unique,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

例如。。。如果我有这样一个文件:

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]+'
,但我想删除所有具有非唯一fist字段的行

最好是Bash和python解决方案

awk '
  {count[$1]++; line[$1]=$0}
  END {for (val in count) if (count[val]==1) print line[val]}
' filename
这可能会改变行的顺序。如果这是一个问题,请尝试以下两种方法:

awk '
  NR==FNR {count[$1]++; next}
  count[$1] == 1 {print}
' filename filename
这可能会改变行的顺序。如果这是一个问题,请尝试以下两种方法:

awk '
  NR==FNR {count[$1]++; next}
  count[$1] == 1 {print}
' filename filename
这个怎么样:

#!/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]
这个怎么样:

#!/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]

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


“-u”选项仅打印唯一的行,“-w3”的比较不超过前3个字符。

在bash中,假设第一列已固定为(3):


“-u”选项仅打印唯一的行,“-w3”的比较不超过前3个字符。

在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]

在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]
如果你不在乎保存顺序,你可以使用一个普通的旧dict(
{}
)而不是
orderedict

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

如果你不在乎保存顺序,你可以使用一个普通的旧dict(
{}
)而不是
orderedict


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

sed一行解决方案:

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

sed一行解决方案:

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

它总是按第一列排序吗?第一列的值有固定范围吗?如果是,范围是什么?它总是按第一列排序吗?第一列的值有固定的范围吗?如果是这样的话,范围是多少?它非常快而且内存效率很高,但是我没有提到真实数据的字符数是可变的。。。但是我可以使用
awk'{print$0,“\t”,$1}'文件| sort | uniq-u-f4
谢谢你的来信!它速度非常快,内存效率也很高,但我没有提到实际数据的字符数是可变的。。。但是我可以使用
awk'{print$0,“\t”,$1}'文件| sort | uniq-u-f4
谢谢你的来信!