2015-04-07 83 views
1

我對ealier文章有跟進問題。 相關的帖子是: Perl iterating through each line in a file and appending to the end of each line in another filePerl遍歷文件中的每一行,並追加到另一個文件中每行的末尾 - 跟進

我用:

use warnings; 
use strict; 

open my $animals, '<', 'File1.txt' or die "Can't open animals: $!"; 
open my $payloads, '<', 'File2.txt' or die "Can't open payloads: $!"; 

my @payloads = <$payloads>; #each line of the file into an array 
close $payloads or die "Can't close payloads: $!"; 

while (my $line = <$animals>) { 
    chomp $line; 
    print $line.$_ foreach (@payloads); 
} 
close $animals or die "Can't close animals: $!"; 

這工作得很好,看起來像這樣的文件:

file 1:  file 2: 
line1  lineA 
line2  lineB 
line3  lineC 

而不是看起來像這樣的文件:

<01 line1 
<02 line2 

所以我想要做的是以下幾點:

file 1:    file 2: 
<01 line1   <AA lineAA 
<02 line2   <AB lineAB 

應該變成:

file 3: 
<01_AA line1lineAA 
<01_AB line1lineAB 
<02_AA line2lineAA 
<02_AB line2lineAB 

我曾嘗試通過使用標籤上分割字符串來解決它,而在while循環(見下文),但我不能讓循環它工作。

我的腳本:

#!C:/perl64/bin/perl.exe 

use warnings; 
use strict; 


open my $file1, '<', 'file1.fasta' or die "Can't open file1: $!"; 
open my $file2, '<', 'file2.fasta' or die "Can't open file2:  $!"; 
open(OUT, '>', 'file3.fasta') or die "Cannot write $!"; 



while (<$file2>) 
{ 
    chomp; 
    my ($F2_Id, @SF2_seq) = split (/\t/, $_); 

    while (<$file1>) 
     { 
      chomp; 
      my ($F1_Id, @F1_seq) = split (/\t/, $_); 
      foreach my $seq (@F1_seq) 
       { 
        print OUT $F1_Id,"_",$F2_Id,"\t",$seq.$_ foreach (@F2_seq),"\n"; 
       } 
      close; 
     } 
} 

我開始用Perl就在最近,所以我可以想像,有很多腳本故障。

對於真的很長的帖子我很抱歉,但我會appriciate任何幫助。

+0

是否所有行都看起來像「<01 line1」或者它只是其中的一部分? – fugu

+0

是的所有線條看起來像<01 line1 – Paeseitje

回答

0

您可以將第一個文件的id和seq存儲在數組數組中。

您還必須用_替換第二個文件中的<

#!/usr/bin/perl 
use warnings; 
use strict; 

open my $LEFT, '<', 'file1.fasta' or die "Can't open file1: $!"; 
open my $RIGHT, '<', 'file2.fasta' or die "Can't open file2: $!"; 
open my $OUT, '>', 'file3.fasta' or die "Cannot write: $!"; 

my @left; 
while (<$LEFT>) { 
    chomp; 
    push @left, [ split /\t/ ]; 
} 

while (<$RIGHT>) { 
    chomp; 
    my ($id, $seq) = split /\t/; 
    $id =~ s/</_/; 
    print {$OUT} "$_->[0]$id\t$_->[1]$seq\n" for @left; 
} 
close $OUT or die "Cannot close: $!"; 
+0

非常感謝你!還有1個小故障。儘管有s />/_ /,第二個'>'並沒有被'_'取代。可能是什麼原因? – Paeseitje

+0

發現它,有一個'<'而不是一個'>',我查看了它。再次感謝! – Paeseitje

相關問題