如何在Perl中过滤或保留重复项?

如何在Perl中过滤或保留重复项?,perl,Perl,我有一个文本字符串,它有一些重复字符(FFGGHHJKL)。通过使用正向前瞻,可以使其唯一: $ perl -pe 's/(.)(?=.*?\1)//g'] 例如,使用“ffeedcgg”,输出为“FEDCG” 我的问题是如何让它在数字上工作(例如212 212 43 5689 6689 5689 71 81==输出应该是212 43 5689 6689 71 81)?另外,如果我们只想从一个有n行的文件中输出重复的记录 212 212 43 43 5689 6689 5689 71 81 6

我有一个文本字符串,它有一些重复字符(FFGGHHJKL)。通过使用正向前瞻,可以使其唯一:

$ perl -pe 's/(.)(?=.*?\1)//g']
例如,使用
“ffeedcgg”
,输出为
“FEDCG”

我的问题是如何让它在数字上工作(例如212 212 43 5689 6689 5689 71 81==输出应该是212 43 5689 6689 71 81)?另外,如果我们只想从一个有n行的文件中输出重复的记录

212 212 43 43 5689 6689 5689 71 81 66 66 67 68 69 69 69 71 71 52 .. 212 212 43 43 5689 6689 5689 71 81 66 66 67 68 69 69 69 71 71 52 .. 输出:

212 212 43 43 5689 5689 66 66 69 69 69 71 71 212 212 43 43 5689 5689 66 66 69 69 69 71 71
我如何才能做到这一点?

以下内容未经测试,但应仅打印副本

my $line = "212 212 43 43 5689 6689 5689 71 81\n";
chomp $line;

my %seen;
my @order;
foreach my $elem (split /\s+/, $line) {
  ++$seen{$elem};
  push @order, $elem if $seen{$elem} == 2;
}

foreach my $elem (@order) {
  print "$elem " x $seen{$elem};
}
print "\n";
要删除重复项,您现在可以:

print "$_ " for keys %seen;
但这并不能维持秩序。你可以像我一样只打印副本。或者对第一部分使用类似(谢谢,daxim)或

的模块

$ cat prog.pl
#! /usr/bin/perl -lp

my %seen;
$_ = join " " => map $seen{$_}++ ? () : $_ => split;

$ echo 212 212 43 43 5689 6689 5689 71 81 | ./prog.pl
212 43 5689 6689 71 81
第二部分

$ cat prog.pl
#! /usr/bin/perl -lp

my %dups;
my @nums = split;
++$dups{$_} for @nums;

$_ = join " " => grep $dups{$_} > 1 => @nums;

$ cat input
212 212 43 43 5689 6689 5689 71 81
66 66 67 68 69 69 69 71 71 52

$ ./prog.pl input
212 212 43 43 5689 5689
66 66 69 69 69 71 71

教老狗一个新把戏:推广
Tie::Hash::Indexed
over
Tie::IxHash
。您好,谢谢您的帮助:)我对它做了一些修改,最后的代码是(希望其他人也能从中受益)#/usr/bin/perl#open(MYFILE,“FILENAME”);foreach$line(){chomp$line;my%seen;my@order;foreach my$elem(split/\s+/,$line){++$seen{$elem};push@order,$elem如果$seen{$elem}==2;}foreach my$elem(@order){print“$elem”x$seen{$elem};}print“\n”}close(MYFILE);再次感谢大家正则表达式只删除连续的重复项,但“数字”示例也显示了删除非连续的重复项。你想要哪个?@Kennedy-是的,先生,你说得对。我想要的数字,可能不是consequetive,这是工作了。非常感谢:)