2016-07-13 3 views
0
私は最初の3つの列が同一であれば、私はこれらの行を結合し、これは

Perlのループ、それはだ印刷するには、複数回の結果

一緒に彼らの4番目の列を追加したい、ファイル内の他のすべての行と列を比較したい

私のperlスクリプトは、これまで

while (<>){ 
    my ($let, $start, $stop, $num) = split; 
    if (defined($oldLet)){ 
     if ($let eq $oldLet and $start == $oldStart and $stop == $oldStop) { 
      print $chr,"\t",$start,"\t",$stop,"\t",$num + $oldNum, "\n"; 
     } 
    } 
    my $oldLet = $let; 
    my $oldStart = $start; 
    my $oldStop = $stop; 
    my $oldNum = $num; 
} 

これはこれは私が出力

として何をしたいです私の入力は

a 4360 5440 23 
a 4360 5440 44 
a 4360 5440 247 
b 0 1090 10 
b 0 1090 11 
b 1090 3550 10 
b 1090 3550 11 

次のようになります

a 4360 5440 314 
a 0 1090 21 
a 1090 3550 21 

は今、私は何も

+0

スクリプトで '使用strict'と'使用warnings'を追加します。ここでは

は作業バージョンです。あなたの '$ chr'変数があなたのスクリプトに宣言されていない場合は、それを明確にしてください – Arijit

答えて

2

を取得していない、あなたのコードにuse warningsuse strictを追加した場合、あなたが見るであろう午前:

Global symbol "$oldLet" requires explicit package name at foo.pl line 8. 
Global symbol "$oldLet" requires explicit package name at foo.pl line 9. 
Global symbol "$oldStart" requires explicit package name at foo.pl line 9. 
Global symbol "$oldStop" requires explicit package name at foo.pl line 9. 
Global symbol "$chr" requires explicit package name at foo.pl line 10. 
Global symbol "$oldNum" requires explicit package name at foo.pl line 10. 
Execution of foo.pl aborted due to compilation errors. at foo.pl line 18. 

問題は、あなたが宣言されていない変数を使用していることですしたがって、それらは暗黙的に空であるため、if (defined $oldLet)は真ではありません。

解決策は、whileループの前に変数を宣言することです。

もう1つの問題は、おそらく$letを意味するときに​​を印刷しようとしていることです。

count.pl

#!/usr/bin/env perl 

use warnings; 
use strict; 

my ($oldLet,$oldStart,$oldStop,$oldNum); 
while (<>) { 
    my ($let, $start, $stop, $num) = split; 
    if (defined $oldLet) { 
     if ($let eq $oldLet and $start == $oldStart and $stop == $oldStop) { 
      $oldNum += $num; # Add up the num column 
     } else { 
      # Output the results 
      print $oldLet,"\t",$oldStart,"\t",$oldStop,"\t",$oldNum, "\n"; 
      $oldNum = $num; 
     } 
    } else { 
     $oldNum = $num; 
    } 

    $oldLet = $let; 
    $oldStart = $start; 
    $oldStop = $stop; 
} 

# Last group 
print $oldLet,"\t",$oldStart,"\t",$oldStop,"\t",$oldNum, "\n"; 

出力

cat input | perl count.pl 

a  4360 5440 314 
b  0  1090 21 
b  1090 3550 21 
関連する問題