+ -
当前位置:首页 → 问答吧 → 求一perl程序,希望得到实在的程序代码帮助

求一perl程序,希望得到实在的程序代码帮助

时间:2010-09-18

来源:互联网

编程需求:如果>行之间相同的字母组合完全相同,则输出相应的>所在的行。

如:

>gi|123|CAV28776.1| unnamed protein product [Physcomitrella patens]
PYCVRMGLKRKILHASEPQSPVGVL
>gi|34fg|gb|CAV28776.1| unnamed protein product [Physcomitrella patens]
PYCVRMGLKRKILHASEPQSPVGVL

两者存在相同的字符串PYCVRMGLKRKILHASEPQSPVGVL,所以输出结果:

>gi|123|CAV28776.1| unnamed protein product [Physcomitrella patens]
>gi|34fg|gb|CAV28776.1| unnamed protein product [Physcomitrella patens]
字符串相同



有一文件,内容如下

如:
>gi|218328416|gb|CAV28776.1| unnamed protein product [Physcomitrella patens]
MPQIQYSEKYFDDTYEYRHVVLPPDIAKLLPKNRLLSEAEWRGIGVQQSRGWVHYAIHRPEPHIMLFRRP
LNYGQPQQAAAVQQQPTGMKA
>gi|218328416|emb|CAV28776.1| unnamed protein product [Physcomitrella patens]
MPQIQYSEKYFDDTYEYRHVVLPPDIAKLLPKNRLLSEAEWRGIGVQQSRGWVHYAIHRPEPHIMLFRRP
LNYGQPQQAAAVQQQPTGMKA
>gi|51833416|emb|CAV28776.1| unnamed protein product [Physcomitrella patens]
MPQIQYSEKYFDDTYEYRHVVLPPDIAKLLPKNRLLSEAEWRGIGVQQSRGWVHYAIHRPEPHIMLFRRP
LNYGQPQQAAAVQQQPTGMKA
>gi|26190151|emb|CAD21955.1| cyclin D [Physcomitrella patens]
MSPSVDCLASLYCAEDVSGTAWNESEMCGAADRVFESQPAVFMDFPVEDDEAIATLLMKEAQFMPEADYL
ERYQSRKLSLEARLAAIEWILKVHSFYNYSPLTVALAVNYMDRFLSRYYFPEGKEWMLQLLSVACISLAA
KMEESDVPILLDFQVEQEEHIFEAHTIQRMELLVLSTLEWRMSGVTPFSYVDYFFHKLGVSDLLLRALLS
RVSEIILKSIRVTTSLQYLPSVVAAASIICALEEVTTIRTGDLLRTFNELLVNVESVKDCYIDMRQSEIG
PYCVRMGLKRKILHASEPQSPVGVLEAADVSSPSGTVLGFSSRESSPDVTDSPPSTNSQRKRRKLCLHNE
SCLHVESASL

输出结果:
>gi|218328416|gb|CAV28776.1| unnamed protein product [Physcomitrella patens]
>gi|218328416|emb|CAV28776.1| unnamed protein product [Physcomitrella patens]
>gi|51833416|emb|CAV28776.1| unnamed protein product [Physcomitrella patens]
字符串相同

附件是一个需要处理的文件

sequences.rar (8.68 KB)

下载次数:3

2010-09-18 11:09

作者: bioinfor   发布时间: 2010-09-18

本帖最后由 longbow0 于 2010-09-18 11:48 编辑

用 Bioperl,Bio::SeqIO

大致是
  1. use Bio::SeqIO

  2. my $o_seqi = Bio::SeqIO->new(
  3.     -file => $infile,
  4.     -format => 'fasta',
  5. );

  6. while (my $o_seq = $o_seqi->next_seq) {
  7.     # 比较 $o_seq->seq 就可以了
  8. }
复制代码

作者: longbow0   发布时间: 2010-09-18

本帖最后由 iamlimeng 于 2010-09-18 12:24 编辑

用HASH吧,很容易实现。如果数据量很大,那要考虑内存容量,或者换一种读文件的方式。
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;

  4. my $data_file = "sequences.txt";
  5. my $result_file = "result.txt";

  6. undef $/;
  7. open(FH,$data_file);
  8. my $data = <FH>;
  9. close FH;

  10. my %hash;
  11. foreach ( split(/>/,$data) ) {
  12.          next if (!$_);
  13.         s/\n//g;
  14.         my ($key,$string) = split /]/;
  15.         push(@{$hash{$string}},">$key]");
  16. }

  17. open(FH,">$result_file");
  18. foreach my $string (keys %hash) {
  19.          if (scalar(@{$hash{$string}}) > 1) {
  20.                  foreach my $key (@{$hash{$string}}) {
  21.                          print FH "$key\n";
  22.                  }
  23.                  print FH "字符串相同\n\n";
  24.          }
  25. }
  26. close FH;
  27. print "OK!\7";
  28. <>;
复制代码

作者: iamlimeng   发布时间: 2010-09-18