【问题标题】:How do I extract DNA sequences from a text file without reading line by line?如何在不逐行读取的情况下从文本文件中提取 DNA 序列?
【发布时间】:2012-08-14 14:26:21
【问题描述】:

我正在尝试从文本文件中提取 DNA 序列并将其存储。我可以使用以下代码来完成,但这不是最好的方法,因为我正在逐行读取文本文件。我想知道是否有一种更简单的方法可以在我的文本文件中找到每个 DNA 序列,而无需逐行读取文本文件。

example.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);

数据.txt

gi|171361,酿酒酵母,(CYS3) 基因,实验室 1,Joe Bloggs GCAGCGATCGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC

gi|171362,酿酒酵母,(CYS4) 基因,实验室 2,Paul McDonald GAAGCGCACGACAGCTGTGCTATCCCGGCGAGCCCGTGGCAGAGGACCTCGCTTGCGAAAGCATCGAGTACC

【问题讨论】:

  • 你想怎么读?
  • 这应该不起作用,因为您正在读取整个文件,然后绑定读取更多数据。您应该在循环之后使用@entire_file 而不是&lt;MYFILE&gt;
  • 我已经阅读了模式匹配,只是不确定如何去做。这么多符号。我希望能够识别 DNA 序列 GATC 等模式并将其存储,而无需读取文本文件中的每一行。如果你能帮忙,请。谢谢。 :)
  • 我在做一个问题,第一部分说提取包含 FASTA 格式文件的 txt 文件的内容,这就是为什么存在@entire 文件。然后它说要提取描述符行,这是由 $line 完成的,然后是我可以做的每个 DNA 序列,但这不是一个很好的方法,这就是我发布问题的原因。
  • 你知道 MYFILE 中描述符行的位置吗?

标签: perl file input dna-sequence


【解决方案1】:

这是一个使用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

【讨论】:

【解决方案2】:

之后

@entire_file = <MYFILE>;

您已将整个文件保存在数组@entire_file 中。之后您使用 readline 运算符 (&lt;..&gt;) 执行的所有其他操作都将不起作用,因为该文件已被完整读取。

你可以遍历数组中的元素,然后对它们做任何你想做的事情,例如,

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

我建议您阅读阅读文件、模式匹配和循环的一般知识。

【讨论】:

  • 考虑在条件之前添加next unless $line =~ /\S/;,以便跳过空白行,否则它们将显示为序列。此外,FASTA 行实际上以 > 开头,但当前格式未显示这些字符,因此需要 $line =~ /^&gt;gi/
  • 感谢您的帮助和反馈。我会去做的。 :)
【解决方案3】:

如果您将文件的所有行都放在一个数组中,则可以遍历该数组以使用正则表达式获取 id/descriptor 和序列元素:

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'
        ];

【讨论】:

    【解决方案4】:

    如果你只想要命令行中的序列,这个单行就可以做到:

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

    详情请见perlrun(1)

    使用awk的类似解决方案:

    awk 'NF { print $NF }' data.txt
    

    【讨论】:

      猜你喜欢
      • 2019-07-09
      • 2011-12-07
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 2015-05-07
      • 2021-10-11
      • 1970-01-01
      相关资源
      最近更新 更多