2012-08-29 75 views
1

我想結合使用Perl的重複行幾乎沒有運氣。我的製表符分隔文本文件的結構如下(空間增加了可讀性):結合txt文件中的重複行與perl

Pentamer Probability Observed Length 
ATGCA 0.008  1  16 
TGTAC 0.021  1  16 
GGCAT 0.008  1  16 
CAGTG 0.004  1  16 
ATGCA 0.016  2  23 
TGTAC 0.007  1  23 

我想是通過添加三個數值列,合併重複的線條爲此含有「ATGCA」現在會是什麼樣子行這個:

ATGCA 0.024 3 39 

任何想法/幫助/建議將不勝感激!謝謝!

+1

請幫助我們通過展示幫助你[你已經嘗試了什麼(http://whathaveyoutried.com) – Zaid

回答

1
#!/usr/bin/perl 

use warnings; 
use strict; 

my %hash; 
while(<>) { 
    my @v = split(/\s+/); 
    if (defined $hash{$v[0]}) { 
    my $arr = $hash{$v[0]}; 
    $hash{$v[0]} = [$v[0], $arr->[1] + $v[1], 
        $arr->[2] + $v[2], $arr->[3] + $v[3]]; 
    } else { 
    $hash{$v[0]} = [@v]; 
    } 
} 
foreach my $key (keys %hash) { 
    print join(" ", @{$hash{$key}}), "\n"; 
} 
+0

除非文件變得非常大,否則它可能並不重要,但值得指出的是,您正在不必要地創建'@ v'的額外副本。我會用'$ hash {$ v [0]} = \ @ v'來替換'$ hash {$ v [0]} = [@v]'來避免這種情況。但是你知道他們對過早優化的看法:-) –

1

這裏的另一種選擇:

use Modern::Perl; 

my %hash; 

while (my $line = <DATA>) { 
    my @vals = split /\s+/, $line; 
    $hash{ $vals[0] }->[$_] += $vals[ $_ + 1 ] for 0 .. 2; 
} 

say join "\t", $_, @{ $hash{$_} } for sort keys %hash; 

__DATA__ 
ATGCA 0.008 1 16 
TGTAC 0.021 1 16 
GGCAT 0.008 1 16 
CAGTG 0.004 1 16 
ATGCA 0.016 2 23 
TGTAC 0.007 1 23 

輸出:

ATGCA 0.024 3 39 
CAGTG 0.004 1 16 
GGCAT 0.008 1 16 
TGTAC 0.028 2 39