[求助]编程求助──字符串处理,有一定挑战性的问题

[求助]编程求助──字符串处理,有一定挑战性的问题

[求助]编程求助──字符串处理,有一定挑战性的问题
了解生物的请看A部分,不了解请看B部分,同样的问题。
A.
我有大量的Fasta格式的多序列,假如要做以下处理:
问题1 去掉特定长度的短序列
若要去除其中小于五十碱基的序列,请问如何操作;
问题2 取motif上下游一定长度的序列(含motif)
  假如我要取每个序列中motif为“AAAA”及其上下游10个碱基的序列片段,并输出位置信息,请问如何编程处理

B.
问题1 去掉特定长度的短字符串
若要去除其中小于五十个字符的字符串,请问如何操作;
问题2 取某个字符模式上下游一定长度的字符串片段(含该字符模式)
  假如我要取每个字符串中字符模式为“AAAA”及其上下游10个字符的字符段,并输出位置信息,请问如何编程处理
(每“>“开头,接着是字符串名及相关属性,接着另起的一行以下为要处理的字符)

部分序列可操作文件如下:
>Y64G10A.7|Y64G10A.7|14302238|14319530|IV
ATATTTCAATTTCAAAATTAAATTTATTTTTATTTTCAACAATTCAATCTCTTGCCCAAA
TCTTTCTTCCCCTCATTTCTCATGTAAGAATCTCATTTTTTGACAGTTAGCCTAGTTATG
TTACAGTTGATTAATTTAAATACTTTTACTGTTTCAGTACTAAAATTTATAAAAATCCGA
GTGTCTTTTTCTTAATGAAATCAGTTTCAATTATTCCAAGCCATAATAACTTTCCATGTT
TTCACACAGGTCTATGTGTTTCATTAAATAAATTT
>Y53F4B.31|gst-28|15166113|15167310|II
ATCGAAAATTTTCTTGAAATTTTGTTCAATGAAGTAATATAATTACAAATTCGAATAAAT
>ZK792.8|atg-4.2|11668005|11671460|IV
TTATTGACAATTTTTGAAATTCTGTACACTGAACATTTATTGGTGCTTGATATGTATTGA
TGACGCAATGTGAACATTATTAAATAAAA
>Y69H2.8|nhr-241|18699416|18700957|V
AGTCATGTTGCCAGGCACAGGCAAATTGTTT
>Y71F9AL.13|rpl-1|2875396|2876313|I
GGTAAAATGTCGAAGGTTTCCCGCGAGTCTCTTAATGAGGCTATCGCTGAGGTCCTTAAG
GGATCCTCGGAAAAGCCACGCAAGTTCCGTGAGACTATCGAGCTCCAGATCGGTCTCAAG
AACTACGACCCACAGAAGGACAAGCGTTTCAGCGGATCCATCAGGTAGCTACGACCTGTG
AAAACAGGGAGTTGGGACTTTCAAAGCCTAACGGACCCCCACCCAGGGTCTTAAATTTTT
GGGGAGGCAATTATTGCCGCTTTGAAATAATGATATGAGCTGGTATAATACTGAAGCACA
TTCCACGCCCAAACATGAAGGTGTGCGTCTTCGGAGACCAGCACCATCTTGACGAGGCTG
CCGCCGGAGACATTCCATCGATGAGCGCCGATGACTTGAAGAAGCTTAACAAGCAGAAGA
AGCTCATCAAGAAGCTCGCCAAGAGCTACGATGCTTTCATCGCTTCCGAATCCTTGATCA
AGCAGATCCCACGTATCCTCGGTCCAGGACTCAACAAGGCCGGAAAATTCCCTTCCGTCG
TTACCCACGGAGAATCTCTCCAAAGCAAGAGTGACGAGATCCGCGCCACCGTCAAGTTCC
AGATGAAGAAG
>Y47G6A.4|Y47G6A.4|3547093|3552007|I
ACGGAAACCCCTCACACATTCATTTCATGGTATTAAATATAAGCATTCTAAAATCCTAAT
TGTACTAATAGTATTATACATGATATACTCTGTCTGTCTGCTTGGTACAAATTTACTTCA
TTCTCAATTTTCAAAACAATAAATCATATATTCTTT
>Y17G9B.4|Y17G9B.4|4752110|4753154|IV
AATAAATGTGTTTTCTTATTTAAAATATTATTCTGTTTCGAG
>Y65B4BR.5|Y65B4BR.5|535792|536676|I
CTTGTTTCCTGATGACCTTGCAGATACTCTTGT
>Y47D3B.11|Y47D3B.11|11456758|11462763|III
AAAATTAGCCAGAATACTCTATCAAAAAATATCATATCACACCTTTTCTTCTCCCAGTTT
TTCTCTTTTTGTCGTGCCTTGCTCGTCATCTCTCCAACCCCGATCTCTGTATTTTTCTCC
ACGTATGACTGCGCCTTGTAGGCACGCAGGTAGGCATTTTTGTGCCTACGTGGATTAATT
GCCTAAATTGTCTTAAAATGCTTAGTGTTTTTCAGGTGTCAAACTTTCCTCCCCATGTGT
ACCCAACGGGTCAATCACATTCTCTTCTTGCATATGAATACATTTTCATTTTTCTGTTGT
TTTTTAGTTTTTTTTTAGACTACCATTTTTTTTTTAACTTTCTAGAAGTTTCTAGTAATA
A

请各位多帮忙!谢谢!




   

可以对字符串计数嘛。看看.
可以对字符串计数嘛。看看index和substr的用法。
while (<>) {-- .
while (<>) {
  if (/^>[^\|]+/) { warn "Processing $&...\n"; next }

> 问题1 去掉特定长度的短字符串
> 若要去除其中小于五十个字符的字符串,请问如何操作;

next if /^[ACTG]{1,49}$/;

或者

next if length < 50;

> 问题2 取某个字符模式上下游一定长度的字符串片段(含该字符模式)
>  假如我要取每个字符串中字符模式为“AAAA”及其上下游10个字符的字符段,并输出位置信息,请问如何编程处理
> (每“>“开头,接着是字符串名及相关属性,接着另起的一行以下为要处理的字符)

if (/[ACTG]{0,10}AAAA[ACTG]{0,10}/) { print "Line $.: Col: ", length($`), ": $&\n" }
}

大意是这样的。。。没有过多地考虑性能优化,这些代码也没有测试过,呵呵,仅供参考 :)
[quote]回复给 agentz : w.
回复给 agentz : while (<>) {-- ....

谢谢!
但无法获得第一问中的剔除了少于50个字符串的字符串。
第二问中不能获得全部的字符串,并且位置也不对。如按你的程序第一个结果为
>Y64G10A.7...
Line 2: Col: 3: TTTCAATTTCAAAATTAAATTTAT
Line 4: Col: 31: TTTCAGTACTAAAATTTATAAAAA
实际应为:
  >Y64G10A.7|Y64G10A.7|14302238|14319530|IV
  4TTTCAATTTCAAAATTAAATTTAT27
  153TTTCAGTACTAAAATTTATAAAAA176
  162TAAAATTTATAAAAATCCGAGTGT185
  163AAAATTTATAAAAATCCGAGTGTC186
另外,程序还需匹配跨行的字符串模式,如
ATATTTCAATTTCAAAATTAAATTTATTTTTATTTTCAACAATTCAATCTCTTGCCCAAA
ACTTTCTTCCCCTCATTTCTCATGTAAGAATCTCATTTTTTGACAGTTAGCCTAGTTATG




   

第一个问题,除去 < 50.
第一个问题,除去 < 50 bp 的序列,可以直接用 bioperl

use Bio::SeqIO;

my $o_seqi = Bio::SeqIO->new(
  -file => $infile,
  -format => 'fasta',
);

my $o_seqo = Bio::SeqIO->new(
  -file => ">$outfile",
  -format => 'fasta',
);

while (my $o_seq = $o_seqi->next_seq) {
  next if ($o_seq->length < 50);
  
  $o_seqo->write_seq($o_seq);
}




   

第二个,同样用 bioperl 第二个,同样用 bioperl

use Bio::SeqIO;

my $o_seqi = Bio::SeqIO->new(
 -file => $infile,
 -format => 'fasta',
);

my $pattern = 'AAAA';

while (my $o_seq = $o_seqi->next_seq) {
  my $seq = $o_seq->seq;  # 提取序列,成为一个字符串

  if ($seq =~ /(.{10}$pattern.{10})/) {
    print $1;
  }
}

longbow,谢谢,不错的解决.
longbow,谢谢,不错的解决方法。