从txt fi中删除重复行

2024-05-17 15:25:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理大型文本文件(~20MB),其中包含由行分隔的数据。 大多数数据项都是重复的,我想删除这些重复项以只保留一个副本。

此外,为了使问题稍微复杂一点,有些条目会重复,并附加一个额外的信息位。在这种情况下,我需要保留包含额外信息的条目并删除旧版本。

例如。 我需要从这个开始:

BOB 123 1DB
JIM 456 3DB AX
DAVE 789 1DB
BOB 123 1DB
JIM 456 3DB AX
DAVE 789 1DB
BOB 123 1DB EXTRA BITS
对此:
JIM 456 3DB AX
DAVE 789 1DB
BOB 123 1DB EXTRA BITS
注意。最后的顺序无关紧要。

做这件事的有效方法是什么?

我可以使用awk、python或任何标准的linux命令行工具。

谢谢。


Tags: 数据方法信息顺序副本情况条目ax
3条回答

不管有额外位的线的位置如何,对glenn jackman答案的这种变化都应该有效:

awk '{idx = $1 " " $2 " " $3; if (length($0) > length(x[idx])) x[idx] = $0} END {for (idx in x) print x[idx]}' inputfile

或者

awk -v ncols=3 '
  {
    key = "";
    for (i=1; i<=ncols; i++) {key = key FS $i}
    if (length($0) > length(x[key])) x[key] = $0
  }
  END {for (y in x) print x[y]}
' inputfile

awk '{x[$1 " " $2 " " $3] = $0} END {for (y in x) print x[y]}'

如果需要指定不同文件的列数:

awk -v ncols=3 '
  {
    key = "";
    for (i=1; i<=ncols; i++) {key = key FS $i}
    if (length($0) > length(x[key])) {x[key] = $0}
  }
  END {for (y in x) print y "\t" x[y]}
'

下面(用Python)如何:

prev = None
for line in sorted(open('file')):
  line = line.strip()
  if prev is not None and not line.startswith(prev):
    print prev
  prev = line
if prev is not None:
  print prev

如果发现内存使用有问题,可以使用Unix sort(即disk-based)作为预处理步骤进行排序,并更改脚本,使其不会将整个文件读入内存。

相关问题 更多 >