2016-05-10 32 views
1

我試圖從超過2,000個子目錄中的「pairsAngles.txt」中grep字符串「Distance:」;子目錄的名稱是從csv文件中獲取的。
然而,下面的代碼只給我以CSV格式輸出的一個巨大的單一的線,我連與文本編輯器打開:Perl:在列中輸出數組

my @pairs=qw(); 
my @result=(); 

my $in; 
my $out; 
my $pairs; 
my $dist = ""; 
my $dir = "/home/avabelieve/aaPROJECT/helicalPair_ax/selectedPairs/renumberedPdb/clusterPairs-1.25-12-05_windows.12.resle3.2A.RMSD1.3/oligomerAngle"; 
my $cluster = "clst1.csv"; 
open ($in, $cluster) || die "cannot open \"$cluster\": $!"; 
my $cU = "clst1Updated.csv"; 
open ($out, ">$cU") || die "cannot open '$cU' $!"; 
my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1 }); 

while (my $c1 = <$in>) {  
    chomp $c1; 
    push @pairs, $c1; 

    foreach $c1 (uniq @pairs) { 
     find (\&Matches, "$dir/$c1"); 
      sub Matches { 
       open ($pairs, "oligomerAngles.out") or die "$!"; 

       while (my $dist = <$pairs>) { 

       if ($dist =~ m/Distance: /){      

        chomp $dist; 
        push (@result, "$dist\n"); 
        @result = split ": ", $dist; 
         }    

        } 
}    } chdir ".."; 

if (not $csv->eof) { 
    $csv->error_diag(); 
} 
$csv->print ($out, [uniq @pairs, @result]); 
} 
close $out or die "$!"; 

回答

2

對於一些奇怪的原因,文:: CSV_XS默認爲有生成CSV時不需要結束分隔符。從文檔the eol attribute ...

當在生成實例中沒有傳入[eol]時,記錄根本沒有終止,因此傳遞您期望的內容可能是明智的。輸出的安全選擇是$ /或\ r \ n。

你可以通過eol => $/Text::CSV_XS->new$/默認爲換行符適用於當前的操作系統),也可以使用$csv->say代替$csv->print它採用$/其EOL默認。我會建議做兩個。

+1

非常感謝!有效!!!但現在我有另一個問題: http://stackoverflow.com/questions/37148048/perl-redundancy-due-to-restart-in-foreach –