0

.fasta形式のDNA配列データの配列を操作するのに問題があります。私が特にやりたいのは、数千のシーケンスを持ち、ファイル内の各シーケンスのシーケンスデータをファイル内の1行に隣接させるファイルを取得することです。[Fasta形式はそのようなものです:シーケンスIDは>で始まり、その後にその行のすべてが説明になります。次の行には、このIDに対応するシーケンスがあります。そして、これは、ファイル内の次のシーケンスのIDである>で始まる次の行まで無期限に続く可能性があります]したがって、私の特定のファイルでは、ほとんどのシーケンスが複数の行にあるので、基本的にやりたいことです改行を削除しますが、シーケンスデータとシーケンスID行(>で始まる)の間ではなく、シーケンスデータ間の新しい行のみを削除します。

これを行うのは、各シーケンスのシーケンス長を取得し(長さを通じて、最も簡単な方法だと思います)、ファイル全体のすべてのシーケンスの平均シーケンス長を取得できるようにするためです。

これまでの私のスクリプトは、機能したくないようです。

#!/usr/bin/perl -w


##Subroutine
sub get_file_data1 { 
    my($filename) = $_[0];
    my @filedata = ();
    unless( open(GET_FILE_DATA, $filename)) {
    print STDERR "Cannot open file \"$filename\"\n\n";
    exit;
    }
    @filedata = <GET_FILE_DATA>;
    close GET_FILE_DATA;
    return @filedata;
}



##Opening files
my $fsafile = $ARGV[0];
my @filedata = &get_file_data1($fsafile);


##Procedure
my @count;
my @ids;
my $seq;

foreach $seq (@filedata){
        if ($seq =~ /^>/) {push @ids, $seq;
                                 push @count, "\n";
    }
        else {push @count, $seq;
    }
}


foreach my $line (@count) {
    if ($line =~ /^[AGTCagtc]/){
         $line =~ s/^([AGTCagtc]*)\n/$1/;
    }
}

##Make a text file to have a look
open FILE3, "> unbrokenseq.txt" or die "Cannot open output.txt: $!";

foreach (@count)
{
    print FILE3 "$_\n"; # Print each entry in our array to the file
}
close FILE3;


__END__
##Creating array of lengths
my $number;
my @numberarray;
foreach $number (@count) {
                push @numberarray, length($number);
                }
print @numberarray;


__END__
use List::Util qw(sum);

sub mean {
    return sum(@numberarray)/@numberarray;
}

手順セクションの2番目のforeach行に問題があり、それが何であるか理解できないようです。END行の後のコードは、プロシージャステップでコードを取得できず、必要な処理を実行できないため、まだ試していません。壊れていないシーケンスの要素を含む素敵な配列を取得する方法はありますか(新しい配列からシーケンスID行を削除することを選択しました..)?その後、長さの配列を取得できたら、平均化できますか?

最後に、残念ながら、Bio :: Perlをコンピューターで動作させることができないことを認める必要があります。何時間も試しましたが、エラーを修正するスキルがありません。私のBio::perlの問題についてうまくいけば助けてくれる人と話をします。しかし、今のところ、私はそれなしで押す必要があります。

ありがとう!この投稿の長さについて申し訳ありませんが、私は助けに感謝します。

アンドリュー

4

3 に答える 3

0

2番目のループの問題は、の値のコピーが含まれている@count ため、実際には何も変更していないことです。$line@count

ただし、2番目のループで実行したいのが最後の改行文字を削除することだけである場合は、chomp関数を使用します。これを使用すると、2番目のループは必要ありません。(また、正規表現を使用するよりも高速です。)

# remove newlines for all array elements before doing anything else with it
chomp @filedata;

# .. or you can do it in your first loop
foreach $seq (@filedata){
    chomp $seq;
    if ($seq =~ /^>/) {
    ...
}

追加のヒント:get_file_data1ファイルが大きい場合、ファイル全体を配列に読み込むために使用すると時間がかかる場合があります。その場合は、ファイルを繰り返し処理することをお勧めします。

open my $FILE_DATA, $filename or die "Cannot open file \"$filename\"\n";
while (my $line = <$FILE_DATA>) {
    chomp $line;
    # process the record as in your Procedure section
    ...
}
close $FILE_DATA;
于 2012-05-11T02:10:53.917 に答える
-1

正規表現は特に$1にキャプチャしますが、ファイルに$_を出力しています。結果はおそらくあなたが意図したものではありません。

于 2012-05-10T23:34:24.557 に答える
-1

s///の文字グループの「*」または「greedy」修飾子に注意してください。通常、代わりに「+」が必要です。'*'は、文字を含まない行にも一致します。

'g'修飾子を使用した検索式も文字をカウントできます。このような:

$perl -e '$a="aggaacaat"; $b = $a =~ s/[a]//g; print $b; '
5

かなりかっこいいね!または、コードで、$ 1に対してlength()を呼び出すこともできます。

正規表現でエスケープされた「/n」を見て、私はびっくりしました。正常に機能しますが、一般的な「行末」の検索語は「$」です。これはよりポータブルで、キャラクター数を台無しにすることはありません。

于 2012-05-11T02:09:13.977 に答える