-3

テキスト ファイルから DNA 配列を抽出して保存しようとしています。次のコードを使用して実行できますが、テキスト ファイルを 1 行ずつ読み取っているため、最適な方法ではありません。テキスト ファイルを 1 行ずつ読み取らずに、テキスト ファイル内の各 DNA 配列を簡単に見つける方法はないかと考えています。

たとえば .pl

#!/usr/local/bin/perl
open(MYFILE, 'data.txt');
@entire_file = <MYFILE>;
while (<MYFILE>) {
    chomp;
    print "$_\n";
}

$line1 = <MYFILE>;
chomp $line1;
$line2 = <MYFILE>;
chomp $line2;
$line3 = <MYFILE>;
chomp $line3;
$line4 = <MYFILE>;
chomp $line4;
$line5 = <MYFILE>;
chomp $line5;

#Prints DNA sequence 1
print "$line2";

#Prints DNA sequence 2
print "$line5";

close(MYFILE);

data.txt

gi|171361、Saccharomyces cerevisiae、(CYS3) 遺伝子、Lab 1、Joe Bloggs GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC

gi|171362、Saccharomyces cerevisiae、(CYS4)遺伝子、Lab 2、Paul McDonald GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC

4

4 に答える 4

3

これはBioPerlのモジュール Bio::SeqIO;を使用した例です。

#!/usr/bin/perl
use strict;
use warnings;
use Bio::SeqIO;

my $in  = Bio::SeqIO->new( -file   => "junk.txt" ,
                           -format => 'FASTA');

while ( my $seq = $in->next_seq() ) {
    printf "id: %s\ndescr: %s\nseq: %s\n\n", $seq->id, $seq->desc, $seq->seq;
}

__END__
Contents of junk.txt

>gi|171361, Saccharomyces cerevisiae, (CYS3) gene, Lab 1, Joe Bloggs
GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCG
CTTGCGAAAGCATCGAGTACC
>gi|171362, Saccharomyces cerevisiae, (CYS4) gene, Lab 2, Paul McDonald
GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCG
CTTGCGAAAGCATCGAGTACC

そして、これがptogramを実行した結果です。

C:\Old_Data\perlp>perl t5.pl
id: gi|171361,
descr: Saccharomyces cerevisiae, (CYS3) gene, Lab 1, Joe Bloggs
seq: GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC

id: gi|171362,
descr: Saccharomyces cerevisiae, (CYS4) gene, Lab 2, Paul McDonald
seq: GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC
于 2012-08-14T17:46:46.657 に答える
1

@entire_file = <MYFILE>;

ファイル全体が配列に保存されています@entire_file<..>ファイルはすでに完全に読み取られているため、後でreadline 演算子 ( ) を使用して行う他のすべての操作は機能しません。

配列内の要素をループして、必要なことを行うことができます。

foreach my $line (@entire_file) {
  if ($line =~ /^gi/) { print "Descriptor: $line" }
  else { print "Sequence: $line" }
}

ファイルの読み取り、パターン マッチング、およびループ全般について読むことをお勧めします。

于 2012-08-14T16:20:32.367 に答える
1

ファイルのすべての行が配列にある場合は、その配列を反復処理して、正規表現を使用せずに ID/記述子とシーケンス要素を取得できます。

use Modern::Perl;
use Data::Dumper;

my ( @id, @des, @dna );
chomp( my @FASTA = <DATA> );

for ( my $i = 0 ; $i < @FASTA ; $i += 3 ) {
    my ( $id, $des ) = split ', ', $FASTA[$i], 2;
    push @id,  $id;
    push @des, $des;
    push @dna, $FASTA[ $i + 1 ];
}

say Dumper \@id, \@des, \@dna;

say @FASTA + 0;

__DATA__
>gi|171361, Saccharomyces cerevisiae, (CYS3) gene, Lab 1, Joe Bloggs
GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC

>gi|171362, Saccharomyces cerevisiae, (CYS4) gene, Lab 2, Paul McDonald
GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC

出力:

$VAR1 = [
          '>gi|171361',
          '>gi|171362'
        ];
$VAR2 = [
          'Saccharomyces cerevisiae, (CYS3) gene, Lab 1, Joe Bloggs',
          'Saccharomyces cerevisiae, (CYS4) gene, Lab 2, Paul McDonald'
        ];
$VAR3 = [
          'GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC',
          'GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC'
        ];
于 2012-08-14T17:10:20.713 に答える
0

コマンドラインからのシーケンスだけが必要な場合は、次のワンライナーで実行できます。

perl -lane 'print $F[-1] if @F' data.txt

詳細perlrun(1)については、を参照してください。

を使用した同様のソリューションawk

awk 'NF { print $NF }' data.txt
于 2012-08-14T22:30:44.667 に答える