2010-05-07 62 views
2

我有一個文本字符串,它有一些重複的字符(FFGGHHJKL)。這些可以通過使用正先行進行獨特:如何在Perl中過濾或保留重複項?

$ perl -pe 's/(.)(?=.*?\1)//g'] 

例如,"FFEEDDCCGG",輸出爲"FEDCG"

我的問題是如何使它在數字上工作(例如212 212 43 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 5689 
66 66 69 69 69 71 71

我怎樣才能做到這一點?

+0

你的正則表達式只刪除*連續*重複,但你的「number」示例也顯示刪除不連續的重複項。你要哪個? – 2010-05-07 22:09:46

+0

@肯尼迪 - 是的,先生,你是對的。我想要的數字可能不是相應的,這是現在的工作。非常感謝:) – manu 2010-05-08 06:57:29

回答

2

以下內容未經測試,但應僅打印出重複項。

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; 

但不保留訂單。你可以做一些類似的事情,只是爲了打印出來。或者使用一個模塊類似Tie::Hash::Indexed(感謝,daxim)或Tie::IxHash

+1

教一個老狗一個新的竅門:在'Tie :: IxHash'上宣傳'Tie :: Hash :: Indexed'。 – daxim 2010-05-07 13:08:43

+0

喜 感謝您的幫助:) 我修改了一下,最後的代碼是(希望別人也會得到好處) #!的/ usr/bin中/ perl的 # 開放(MYFILE「文件名」); foreach $ line(){ chomp $ line; my%seen; my @order;我的$ elem(split/\ s + /,$ line){ } push @order,$ elem if $ seen {$ elem} == 2; } foreach my $ elem(@order){ print「$ elem」x $ seen {$ elem}; } print「\ n」; } close(MYFILE); 再次感謝大家 – manu 2010-05-08 06:52:45

0

對於第一部分

$ 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