用于在文件中查找“n”个重复行的正则表达式/算法

时间:2015-06-12 15:13:21

标签: regex algorithm count find duplicates

我正在寻找this的高级版本。

基本上,如果我有一个带文字的文件:

abc
ghi
fed
jkl
abc
ghi
fed

我希望输出为:(对于n=3

Duplicated Lines
abc
ghi
fed
Times = 2

2 个答案:

答案 0 :(得分:1)

一种方法是根据你的n分割你的文本,然后计算所有依赖于这个计数的元素的数量,你可以使用一些在python中使用散列表如字典的数据结构,这对于这样的任务。

任务是创建一个字典,使字符保持唯一,然后循环遍历分割文本列表,并在每次看到重复项时增加每个项目的计数。

最后,您将拥有一个字典,其中包含唯一的项目,这些项目将计为字典值。

像python这样的langs提供了很好的工具,如Counter,用于计算可迭代中的元素,islice用于切片和迭代,返回生成器,对于长迭代非常有效:

>>> from collections import Counter
>>> from itertools import islice

>>> s="""abc
... ghi
... fed
... jkl
... abc
... ghi
... fed"""
>>> sp=s.split()
>>> Counter('\n'.join(islice(sp,i,i+3)) for i in range(len(sp)))
Counter({'abc\nghi\nfed': 2, 'fed': 1, 'jkl\nabc\nghi': 1, 'ghi\nfed': 1, 'fed\njkl\nabc': 1, 'ghi\nfed\njkl': 1})

或者你可以自定义:

>>> a=['\n'.join(sp[i:i+3] for i in range(len(sp))]
>>> a
['abc\nghi\nfed', 'ghi\nfed\njkl', 'fed\njkl\nabc', 'jkl\nabc\nghi', 'abc\nghi\nfed', 'ghi\nfed', 'fed']
>>> d={}
>>> for i in a:
...    if i in d:
...       d[i]+=1
...    else :
...       d[i]=1
... 
>>> d
{'fed': 1, 'abc\nghi\nfed': 2, 'jkl\nabc\nghi': 1, 'ghi\nfed': 1, 'fed\njkl\nabc': 1, 'ghi\nfed\njkl': 1}
>>> 

答案 1 :(得分:1)

所以,像这样(在perl中):

perl -e 'while ( <> ) { push ( @order, $_ ) unless $seen{$_}++; } for (@order) {print if $seen{$_} > 1}' myfile

这可以通过以下方式变成更短的片段:

{{1}}