Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex/查找'的算法;n';文件中的重复行_Regex_Algorithm_Count_Find_Duplicates - Fatal编程技术网

Regex/查找'的算法;n';文件中的重复行

Regex/查找'的算法;n';文件中的重复行,regex,algorithm,count,find,duplicates,Regex,Algorithm,Count,Find,Duplicates,我正在寻找一个高级版本的 基本上,如果我有一个包含文本的文件: abc ghi fed jkl abc ghi fed 我希望输出为:(forn=3) 一种方法是根据n拆分文本,然后计算所有元素的数量,所有这些都取决于此计数。您可以使用一些数据结构,使用python中类似哈希表的字典,这对于此类任务非常有效 任务是创建一个保持键唯一性的字典,然后在拆分文本列表上循环,并在每次看到重复项时增加每个项的计数 最后,您将拥有一个包含唯一项的字典,这些项将作为字典的值 有些语言(如python)提供了

我正在寻找一个高级版本的

基本上,如果我有一个包含文本的文件:

abc
ghi
fed
jkl
abc
ghi
fed
我希望输出为:(for
n=3


一种方法是根据
n
拆分文本,然后计算所有元素的数量,所有这些都取决于此计数。您可以使用一些数据结构,使用python中类似哈希表的字典,这对于此类任务非常有效

任务是创建一个保持键唯一性的字典,然后在拆分文本列表上循环,并在每次看到重复项时增加每个项的计数

最后,您将拥有一个包含唯一项的字典,这些项将作为字典的值

有些语言(如python)提供了很好的工具,如
Counter
用于计算iterable中的元素,以及
islice
用于切片和iterable,这些工具返回一个生成器,对于长iterable非常有效:

>>> 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}
>>> 
因此,类似这样的内容(在perl中):

#/usr/bin/perl
严格使用;
使用警告;
我看到的百分比;
我的订单;
while(我的$line=){
chomp($line);
推送(@order,$line),除非$seen{$line}++;
}
foreach my$元素(@order){
如果$SEED{$element}>1,则打印“$element,$SEED{$element}\n”;
}
__资料__
abc
ghi
联邦调查局人员
jkl
abc
ghi
联邦调查局人员
可以通过以下方式将其转换为较短的代码段:

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

您使用的是哪种语言?我不是在寻找特定于语言的解决方案,不过,为了回答您的问题,让我们假设Python。@s4san输出中的行是否必须按照它们在输入中出现的顺序?在您的示例中,如果输出中出现
abc\nfed\nghi\n
,会不会很糟糕?如果没有,您可以简单地使用UNIX实用程序
sort
uniq
@Jubobs对输出进行排序,因为我必须提取重复项。
n=3
意味着什么?因此,这里的键是行,我以n=1开始搜索,并查找n=1的所有重复项,然后通过递增n进行递归?@s4san不,你可以根据
n
分割文本,你可以编辑你的答案吗,上面写着“test”,所以我很困惑:)@s4san哦,对不起,只是输入错误!使用散列太容易了。我认为OP需要一个痛苦的解决方案。好吧,我总是可以对它进行一行加密,使其成为正确的“只写”perl。
#!/usr/bin/perl
use strict;
use warnings;

my %seen; 
my @order; 

while ( my $line = <DATA> ) {
   chomp ( $line ); 
   push ( @order, $line ) unless $seen{$line}++; 

}

foreach my $element ( @order ) { 
    print "$element, $seen{$element}\n" if $seen{$element} > 1;
}

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