2

世界のPerlマスターへ!

このようなファイルを解析して作成したい......

1列目からID、エクソン情報、開始位置、終了位置、方向。数字に出会うとIDが1増えます。

1   9239    712 8571    +
1   start_codon 712 714 +
1   stop_codon  8569    8571    +
2   3882    24137   24264   +
2   start_codon 24137   24139   +
3   3882    24322   24391   +
4   3882    24490   26064   +
4   stop_codon  26062   26064   +
5   4972    26704   26740   +
5   start_codon 26704   26706   +
6   4972    26814   27170   +
7   4972    27257   27978   +
7   stop_codon  27976   27978   +
8   10048   40161   41114   -
8   start_codon 41112   41114   -
8   stop_codon  40161   40163   -
9   272 43167   43629   -
9   stop_codon  43167   43169   -
10  272 43755   44059   -
10  start_codon 44057   44059   -

このような ....

1   9239    *712*   *8571*  +
1   start_codon 712 714 +
1   stop_codon  8569    8571    +
*X  9239    712 8571    +*
2   3882    *24137* 24264   +
2   start_codon 24137   24139   +
3   3882    24322   24391   +
4   3882    24490   *26064* +
4   stop_codon  26062   26064   +
*X  3882    24173   26064   +*
5   4972    *26704* 26740   +
5   start_codon 26704   26706   +
6   4972    26814   27170   +
7   4972    27257   *27978* +
7   stop_codon  27976   27978   +
*X  4972    26704   27978 +*
8   10048   *40161* *41114* -
8   start_codon 41112   41114   -
8   stop_codon  40161   40163   -
*X  10048   40161   41114   -*
9   272 *43167* 43629   -
9   stop_codon  43167   43169   -
10  272 43755   *44059* -
10  start_codon 44057   44059   -
*X  272 43167   44059   -*

Xで始まる各行を追加する必要がありますが、私のスキルではできません... :(

問題は、「start_codon」と「end_codon」を無視した 2 番目の列のすべてのエクソン番号について、アスタリスク間の最小番号付きエクソン位置と最大番号付きエクソン位置を取得する必要があることです *.

これはデータを解析するための私の基本的なコードです...しかし、最初から再コーディングする必要があると思います(行「X」を挿入する方法がわかりません)

(申し訳ありませんが、コードが十分ではなく、混乱を招く可能性があるため、コードを削除しました...)

世界の Perl マスターの皆さん、助けていただけませんか???

ありがとうございました!!

TLPが終わったので、コードを元に戻しました。恥ずかしいコードですが

use strict;

if (@ARGV != 1) {
    print "Invalid arguments\n";
    print "Usage: perl min_max.pl [exon_output_file]\n";
    exit(0);
}

my $FILENAME = $ARGV[0];
    my  $exonid = 0;
    my  $exon = "";
    my  $startpos = 0;
    my  $endpos = 0;
    my  $strand = "";
    my  $min_pos = 0;
    my  $max_pos = 0;

open (DATA, $FILENAME);

while (my $line = <DATA>) {
    chomp $line;

    if ($line ne "") {
        if ($line =~ /^(.+)\t(.+)\t(.+)\t(.+)\t(.+)/) {
        $exonid = $1;
        $exon = $2;
        $startpos = $3;
        $endpos = $4;
        $strand = $5;
        }
        if ($exon =~ /\d+/) {
            print $exonid,"\t",$exon,"\t",$startpos,"\t",$endpos,"\t",$strand,"\n";
        } else {
            print $exonid,"\t",$exon,"\t",$startpos,"\t",$endpos,"\t",$strand,"\n";
        }
    }
}

close (DATA);
exit;

最大値と最小値を比較するにはどうすればよいですか...

4

2 に答える 2

2

私があなたを正しく理解していれば、あなたが求めていると思われることを行う1つの方法(テストされていません!)があります:

use strict;
use warnings;
use feature 'say';

# read first line, initialize accumulators, print it back
chomp($_ = <>);
my ($last_id, $last_exon, $min_start, $max_end, $last_strand) = split /\t/;
say $_;

# loop over remaining lines
while (<>) {
    chomp;
    my ($exonid, $exon, $startpos, $endpos, $strand) = split /\t/;

    if ($exon !~ /\D/ and $exon != $last_exon) {
        # new exon found, print summary of last one...
        say join "\t", "X", $last_exon, $min_start, $max_end, $last_strand;
        # ...and reset accumulators
        ($last_id, $last_exon, $min_start, $max_end, $last_strand)
            = ($exonid, $exon, $startpos, $endpos, $strand);
    }
    else {
        # previous exon continues, just update accumulators
        $last_id     = $exonid;
        $last_exon   = $exon     if $exon !~ /\D/;
        $min_start   = $startpos if $min_start > $startpos;
        $max_end     = $endpos   if $max_end < $endpos;
        $last_strand = $strand;  # should not really be needed
    }
    # ...and don't forget to print the original line back again
    say $_;
}
# end of file, print summary of last exon
print join("\t", "X", $last_exon, $min_start, $max_end, $last_strand), "\n";

X基本的に、その列の前の数値とは異なる 2 列目の数値に遭遇したときはいつでもで始まる要約行を印刷したいと考えており、2 列目に数値以外の値を含む行は決して要約をトリガーします。また、おそらくファイルの最後にも要約行が必要になるでしょう。

数値のみが含まれている場合、式$exon !~ /\D/は true を返します$exon。(具体的には、数値以外の文字が含まれていないかどうかをテストするため、空の文字列も一致します。)

データでそれらが可能かどうか、またそれらが発生した場合にどのように処理するかがわからないため、考慮していないエッジケースがたくさんあります。たとえば、エクソン番号が同じままでストランドが変化するという万一の場合に備えて、要約も出力したい場合があります。同様に、注意深いプログラマーは、入力ファイルが空である可能性や、最初の行の 2 列目に数値以外の値が含まれている可能性を考慮する必要があるかもしれません。

少なくとも、use warnings私が仮定した値のいずれかが常に数値ではないことが判明した場合は、警告が表示されます。

于 2012-12-26T12:34:10.453 に答える