免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: little_joe

’求助!!!求助!!!文件匹配输出特定的内容‘ [复制链接]

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-06-30 16:21 |显示全部楼层
回复 50# b114213903
谢谢大神指点, 如果您有时间的话, 也请多多回帖 向您学习.

   

论坛徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之德黑兰石油
日期:2015-07-15 08:46:452015亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
发表于 2016-07-01 10:09 |显示全部楼层
回复 51# sunzhiguolu


    入门级小菜鸟,所谓的生物信息学员,跟类似的数据打交道比较多,经常用BioPerl模块而已……

论坛徽章:
0
发表于 2016-09-05 17:52 |显示全部楼层
不好意思,又来麻烦您,您之前帮忙写的脚本非常好用,受益匪浅,我想在问您一下,要是在这两个文件事例中加一点文件限制条件,其它的匹配模式都不变,这样是不是直接加一些条件语句就好了?
例如:在id匹配上之后,读取文件b时对Identities = 49/56 (88%)即序列相似性大于90%才进行序列匹配输出,否则直接跳出忽略,
这样您写的程序我尝试修改了一下,结果功夫不到家,只好又来请教,
这是您上次写的,麻烦您在帮忙给看看
O(∩_∩)O谢谢
#!/usr/bin/perl
use strict;
use warnings;


sub collect_data{
    my (%ha, %hFilt, $id);
    open (my $fhA, '<', shift);
    while (defined (local $_ = <$fhA>){
        if (/\A([a-z]\S+)/i){
            %hFilt = () if (!exists $ha{$1});
            $id = $1;
            next;
        }
        push (@{$ha{$id}}, $1) if (/\A\s*(\d+)/ and !$hFilt{$1}++);
    }
    close ($fhA);
    \%ha;
}


sub compare{
    my ($id, $rh, @aData) = (@_);
    my %hStat;
    foreach my $v (@{$rh->{$id}}){
        foreach my $V (grep {$v >= $_->[0] && $v <= $_->[2]} @aData){
            my ($cnt, $leng) = (0, $v - $V->[0] + 1);
            if ((local $_ = substr ($V->[1], 0, $leng)) =~ /-/){
                $cnt = s/-//g;
                $cnt += length ($1) if (substr ($V->[1], $leng - 2, 1) eq '-' and substr ($V->[1], $leng) =~ /\A(-+)/);
            }
            my @aChars = split (//, $V->[4]);
            next if ($aChars[$v - $V->[0] + $cnt] eq '-');
            $hStat{$aChars[$v - $V->[0] + $cnt]}++;
        }
    }
    if (%hStat){
        print "$id\t";
        print "$_hStat{$_}\t" for keys %hStat;
        print "\n";
    }
}


my $rha = collect_data (shift);


open (my $fh, '<', shift);
my ($Flag, $Offset, $ID, @aData) = 0;
while (defined (local $_ = <$fh>){
    next if (/\A\s*\z/ or !/\A(?uery|Sbjct)/);
    if (/\AQuery=\h+(\S+)/){
        compare ($ID, $rha, splice (@aData)) if (@aData);
        exists ($rha->{$1}) ? do {($ID, $Flag, $Offset) = ($1, 1, -1)} : ($Flag = 0);
        next;
    }
    next if (!$Flag);
    if (/\A(Query|Sbjct)\h+(\d+)\h+(\H+)\h+(\d+)/){
        push (@{$aData[$1 eq "Query" ? ++$Offset : $Offset]}, $2, $3, $4);
    }
}
close ($fh);
compare ($ID, $rha, splice (@aData)) if ($Flag);

文件A:
WP_000636925.1-1
        62
        63
        62
        63
        62
        63
        62
        63
        62
        63
        62
        63
        62
        63
        62
        63
        62
        63
        62
WP_000567766.1-1
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        77
        79
        79
        79
        80
        80
        80
        80
        80
        80
WP_000636925.1-1
        62
        63
        62
        63
        62
        63
        62
        63
        62
        63
        62
        63
        62
        63
        62
        63
        62
        63
        62
WP_001341795.1-1
        24
        24
        24
        24
        24
文件B:
BLASTP 2.2.29+


Reference: Stephen F. Altschul, Thomas L. Madden, Alejandro A.
Schaffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J.
Lipman (1997), "Gapped BLAST and PSI-BLAST: a new generation of
protein database search programs", Nucleic Acids Res. 25:3389-3402.


Reference for composition-based statistics: Alejandro A. Schaffer,
L. Aravind, Thomas L. Madden, Sergei Shavirin, John L. Spouge, Yuri
I. Wolf, Eugene V. Koonin, and Stephen F. Altschul (2001),
"Improving the accuracy of PSI-BLAST protein database searches with

Query= WP_001386572.1-1

Length=21


***** No hits found *****



Lambda      K        H        a         alpha
   0.314    0.134    0.424    0.792     4.96

Gapped
Lambda      K        H        a         alpha    sigma
   0.267   0.0410    0.140     1.90     42.6     43.6

Effective search space used: 1206911076


Query= WP_000636925.1-1

Length=105
                                                                      Score     E
Sequences producing significant alignments:                          (Bits)  Value

lcl|CU928161.2_prot_CAR03545.1_2173  [gene=ECS88_2260] [protein=c...    104   2e-29


>lcl|CU928161.2_prot_CAR03545.1_2173 [gene=ECS88_2260] [protein=conserved hypothetical protein] [protein_id=CAR03545.1]
[location=2240570..2240740]
Length=56

Score =   104 bits (260),  Expect = 2e-29, Method: Compositional matrix adjust.
Identities = 49/56 (88%), Positives = 52/56 (93%), Gaps = 0/56 (0%)

Query  8   LLFTIMRSLYLKIRFPSDLRSINALNYLQVPSIDWSDSGYVQHFINVIEKMLTRKK  63
           +LFTIMRSLYLK RFPSDL+SINALNYLQVPSIDWSDSGY+QHFINVIEKM T  K
Sbjct  1   MLFTIMRSLYLKSRFPSDLKSINALNYLQVPSIDWSDSGYIQHFINVIEKMPTTNK  56



Lambda      K        H        a         alpha
   0.325    0.135    0.407    0.792     4.96

Gapped
Lambda      K        H        a         alpha    sigma
   0.267   0.0410    0.140     1.90     42.6     43.6

Effective search space used: 1406358592
Query= WP_000636925.1-1

Length=105
                                                                      Score     E
Sequences producing significant alignments:                          (Bits)  Value

lcl|CU928161.2_prot_CAR03545.1_2173  [gene=ECS88_2260] [protein=c...    104   2e-29


>lcl|CU928161.2_prot_CAR03545.1_2173 [gene=ECS88_2260] [protein=conserved hypothetical protein] [protein_id=CAR03545.1]
[location=2240570..2240740]
Length=56

Score =   104 bits (260),  Expect = 2e-29, Method: Compositional matrix adjust.
Identities = 49/56 (88%), Positives = 52/56 (93%), Gaps = 0/56 (0%)

Query  8   LLFTIMRSLYLKIRFPSDLRSINALNYLQVPSIDWSDSGYVQHFINVIEKMLTRKK  63
           +LFTIMRSLYLK RFPSDL+SINALNYLQVPSIDWSDSGY+QHFINVIEKM T  K
Sbjct  1   MLFTIMRSLYLKSRFPSDLKSINALNYLQVPSIDWSDSGYIQHFINVIEKMPTTNK  56



Lambda      K        H        a         alpha
   0.325    0.135    0.407    0.792     4.96

Gapped
Lambda      K        H        a         alpha    sigma
   0.267   0.0410    0.140     1.90     42.6     43.6

Effective search space used: 1406358592
回复 43# sunzhiguolu




论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-09-07 09:23 |显示全部楼层
回复 53# little_joe

对于这句话, 如何理解?

在id匹配上之后,读取文件b时对Identities = 49/56 (88%)即序列相似性大于90%才进行序列匹配输出,否则直接跳出忽略




论坛徽章:
0
发表于 2016-09-07 15:39 |显示全部楼层
文件a和文件b的匹配方式不变,只是之前当文件a与文件b匹配成功后,直接读取序列输出想要的结果,现在这些条件都不变,只需要在匹配成功后对文件b中的Identities = 49/56 (88%)进行筛选,这里是88%
而设置的筛选条件是90%,也就是只有Identities = 49/56 (88%)后面括号的数值大于90%才进行下一步序列读取匹配
黄色的您标出来的数字的结果就是后面括号的数值,它代表两条序列的相似性,49/56就是说总共序列是56个字母,完全一样的是49个,
这样两条序列的相似性就为88%,
谢谢您的回复~~~
回复 54# sunzhiguolu



论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-09-07 16:23 |显示全部楼层
回复 55# little_joe
它代表两条序列的相似性,49/56就是说总共序列是56个字母,完全一样的是49个
这个 49 是怎么得来的?


论坛徽章:
0
发表于 2016-09-07 23:01 |显示全部楼层
>lcl|CU928161.2_prot_CAR03545.1_2173 [gene=ECS88_2260] [protein=conserved hypothetical protein] [protein_id=CAR03545.1]
[location=2240570..2240740]
Length=56

Score =   104 bits (260),  Expect = 2e-29, Method: Compositional matrix adjust.
Identities = 49/56 (88%), Positives = 52/56 (93%), Gaps = 0/56 (0%)

Query  8   LLFTIMRSLYLKIRFPSDLRSINALNYLQVPSIDWSDSGYVQHFINVIEKMLTRKK  63
           +LFTIMRSLYLK RFPSDL+SINALNYLQVPSIDWSDSGY+QHFINVIEKM T  K
Sbjct  1   MLFTIMRSLYLKSRFPSDLKSINALNYLQVPSIDWSDSGYIQHFINVIEKMPTTNK  56

49就是两条序列比较得出的完全相同的部分,总共是49个字母,它们每个相互对应,如上面用酸橙色标出的部分中的字母总共就是49个,它们与Query和Sbjct 的序列相对应这里由于格式问题没对太清楚,您可以看看文件。例如
Query  122  PGAAALNGDYIWDMILIPVSSLILS  146
                  PGAAALNGDYIWDMILIPVSSLILS
Sbjct   122  PGAAALNGDYIWDMILIPVSSLILS  146
这个序列的Identities = 25/25 (100%),25就是它们在BLAST(生物学中常用的软件,用于分析基因序列的相似性)的过程中匹配到的序列长度。回复 56# sunzhiguolu

论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-09-08 16:35 |显示全部楼层
49就是两条序列比较得出的完全相同的部分,总共是49个字母,它们每个相互对应
大师, 到底是那两条序列. 先前好像没有提到两条序列的事啊, 也许我忘记了 麻烦提个醒.

论坛徽章:
0
发表于 2016-09-08 23:07 |显示全部楼层
是我没说清楚地原因,两条序列就是Query和Sbjct两条互相对比的序列,Query  122  PGAAALNGDYIWDMILIPVSSLILS  146
                  PGAAALNGDYIWDMILIPVSSLILS
Sbjct   122  PGAAALNGDYIWDMILIPVSSLILS  146
例如这个序列的Identities = 25/25 (100%)
而上面的红色字母就是Query和Sbjct匹配上的相似序列
也就是说经过比对Query和Sbjct总共匹配到25个氨基酸(就是字母)
而且这25个氨基酸完全一样则Identities = 25/25 (100%)
这条序列Identities = 49/56 (88%)
Query  8   LLFTIMRSLYLKIRFPSDLRSINALNYLQVPSIDWSDSGYVQHFINVIEKMLTRKK  63
               +LFTIMRSLYLK RFPSDL+SINALNYLQVPSIDWSDSGY+QHFINVIEKM T  K
Sbjct  1   MLFTIMRSLYLKSRFPSDLKSINALNYLQVPSIDWSDSGYIQHFINVIEKMPTTNK  56
是因为总共匹配到56个氨基酸,但是其中有7个是(+和空格),
+代表两条序列的氨基酸虽然不同但是两个氨基酸性质相近,空格是为了让更多的氨基酸匹配上而插入的,
这些都是生物分析软件BLAST按照一定生物信息学原则自动进行的回复 58# sunzhiguolu


论坛徽章:
307
程序设计版块每周发帖之星
日期:2016-04-08 00:41:33操作系统版块每日发帖之星
日期:2015-09-02 06:20:00每日论坛发贴之星
日期:2015-09-02 06:20:00程序设计版块每日发帖之星
日期:2015-09-04 06:20:00每日论坛发贴之星
日期:2015-09-04 06:20:00每周论坛发贴之星
日期:2015-09-06 22:22:00程序设计版块每日发帖之星
日期:2015-09-09 06:20:00程序设计版块每日发帖之星
日期:2015-09-19 06:20:00程序设计版块每日发帖之星
日期:2015-09-20 06:20:00每日论坛发贴之星
日期:2015-09-20 06:20:00程序设计版块每日发帖之星
日期:2015-09-22 06:20:00程序设计版块每日发帖之星
日期:2015-09-24 06:20:00
发表于 2016-09-09 10:24 |显示全部楼层
修改两处代码:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub collect_data{
  5.     my (%ha, %hFilt, $id);
  6.     open (my $fhA, '<', shift);
  7.     while (defined (local $_ = <$fhA>)){
  8.         if (/\A([a-z]\S+)/i){
  9.             %hFilt = () if (!exists $ha{$1});
  10.             $id = $1;
  11.             next;
  12.         }
  13.         push (@{$ha{$id}}, $1) if (/\A\s*(\d+)/ and !$hFilt{$1}++);
  14.     }
  15.     close ($fhA);
  16.     \%ha;
  17. }

  18. sub compare{
  19.     my ($id, $rh, @aData) = (@_);
  20.     my %hStat;
  21.     foreach my $v (@{$rh->{$id}}){
  22.         foreach my $V (grep {$v >= $_->[0] && $v <= $_->[2]} @aData){
  23.             my ($cnt, $leng) = (0, $v - $V->[0] + 1);
  24.             if ((local $_ = substr ($V->[1], 0, $leng)) =~ /-/){
  25.                 $cnt = s/-//g;
  26.                 $cnt += length ($1) if (substr ($V->[1], $leng - 2, 1) eq '-' and substr ($V->[1], $leng) =~ /\A(-+)/);
  27.             }
  28.             my @aChars = split (//, $V->[4]);
  29.             next if ($aChars[$v - $V->[0] + $cnt] eq '-');
  30.             $hStat{$aChars[$v - $V->[0] + $cnt]}++;
  31.         }
  32.     }
  33.     if (%hStat){
  34.         print "$id\t";
  35.         print "$_:$hStat{$_}\t" for keys %hStat;
  36.         print "\n";
  37.     }
  38. }

  39. my $rha = collect_data (shift);

  40. open (my $fh, '<', shift);
  41. my ($Flag, $Offset, $ID, @aData) = 0;
  42. while (defined (local $_ = <$fh>)){
  43.     next if (/\A\s*\z/ or !/\A(?:Query|Sbjct|Identities)/);    # 添加一条判断
  44.     if (/\AQuery=\h+(\S+)/){
  45.         compare ($ID, $rha, splice (@aData)) if (@aData);
  46.         exists ($rha->{$1}) ? do {($ID, $Flag, $Offset) = ($1, 1, -1)} : ($Flag = 0);
  47.         next;
  48.     }
  49.     $Flag = 0 if (/\bIdentities.+?(\d+)\%/ and $1 < 90);    # 如果百分比小于 90%, 则忽略后面的统计
  50.     next if (!$Flag);
  51.     if (/\A(Query|Sbjct)\h+(\d+)\h+(\H+)\h+(\d+)/){
  52.         push (@{$aData[$1 eq "Query" ? ++$Offset : $Offset]}, $2, $3, $4);
  53.     }
  54. }
  55. close ($fh);
  56. compare ($ID, $rha, splice (@aData)) if ($Flag);
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP