2012-03-28 170 views
-1

我有一個看起來像這樣的文件。刪除perl hash中的冗餘

a_8_3_1-b_30_5_6-c_6_2_1- + b_30_5_6- 
a_123_1_1- + d_144_1_7- 
a_123_1_1- + c_1_4_1- 
b_50_1_1- + d_144_1_7- 
a_123_1_1- + c_2_1_2- 
c_1_4_1- + a_123_1_1- 
a_123_1_1- + a_93_1_2- 
d_144_1_7- + a_123_1_1- 
c_2_1_2- + a_123_1_1- 
a_123_1_1- + c_2_1_2- 

它有2列,用「+」號分隔。我需要計算此文件中存在的唯一組合的數量。

如所見,形成了組合,例如在a_123_1_1-和c_2_1_2-之間,以及在c_2_1_2- + a_123_1_1-之間。現在我需要計算不。在這樣一個文件中出現這樣的對,我知道這個組合(不管它們的相對順序)發生3次。

與a_123_1_1-和d_144_1_7-類似的情況。它們以兩種組合出現。每個組合出現一次。因此,這是累積計數= 2

我有截至目前爲止,嘗試所有這些行中的散列(即每一行將是一個關鍵,其出現將是其對應的值),並打印出沒有。在PERL中使用映射函數的發生次數。

但是,我如何包含這樣的冗餘並解決單個元素之間的順序問題?

請幫忙。

+4

顯示您已擁有的代碼。 – daxim 2012-03-28 12:16:21

回答

5

像往常一樣用Perl 處理有一個以上的方式做到這,但是當你可以:

  1. 分割每行,這樣它會產生兩個條目
  2. 排序的@pair您@pair,這樣一雙獨特總是會導致相同的順序
  3. CONCAT排序@pair,讓你得到一個字符串
  4. 店您在%哈希字符串並計算出現

如在下面的例子:

use warnings; 
use strict; 

use Data::Dumper; 

my %count; 

for (<DATA>) { chomp; 
    my $str_pair = join ':', sort split/\+ /; 
    $count{$str_pair}++; 
} 

print STDERR Dumper \%count; 

__DATA__ 
a_8_3_1-b_30_5_6-c_6_2_1- + b_30_5_6- 
a_123_1_1- + d_144_1_7- 
a_123_1_1- + c_1_4_1- 
b_50_1_1- + d_144_1_7- 
a_123_1_1- + c_2_1_2- 
c_1_4_1- + a_123_1_1- 
a_123_1_1- + a_93_1_2- 
d_144_1_7- + a_123_1_1- 
c_2_1_2- + a_123_1_1- 
a_123_1_1- + c_2_1_2- 

輸出

$VAR1 = { 
      'a_8_3_1-b_30_5_6-c_6_2_1-:b_30_5_6-' => 1, 
      'a_123_1_1-:c_2_1_2-' => 3, 
      'a_123_1_1-:c_1_4_1-' => 2, 
      'a_123_1_1-:a_93_1_2-' => 1, 
      'b_50_1_1-:d_144_1_7-' => 1, 
      'a_123_1_1-:d_144_1_7-' => 2 
     }; 
0
my %terms; 
while (<>) { 
    next unless my @parts = split /\s*\+\s*/; 
    $terms{$_}++ foreach @parts; 
} 

say +(keys %terms) . ' unique terms.'; 
0

THISIS單行程序來處理你描述

perl -naF"/[\s+]+/" -e "$p{join ' ', sort @F}++; END{print 0+keys %p, qq(unique pairs\n)}" myfile 
0123中的數據

隨着你的問題的數據,如果您需要任何東西更復雜,你需要恢復到一個完整的程序該電源輸出

6 unique pairs 

。這相當於上面的代碼

use strict; 
use warnings; 

my %pairs; 

while (<>) { 
    my $key = join ' ', sort split /[\s+]+/; 
    $pairs{$key}++; 
} 

printf "%d unique pairs\n", scalar keys %pairs;