免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
1234567
最近访问板块 发新帖
楼主: 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
61 [报告]
发表于 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);
复制代码

论坛徽章:
0
62 [报告]
发表于 2016-09-10 13:24 |只看该作者
再次表示感谢,谢谢您的帮助回复 60# sunzhiguolu


论坛徽章:
0
63 [报告]
发表于 2017-02-09 10:53 |只看该作者
回复 60# sunzhiguolu 您好,最近在使用楼上(60楼)添加了判断功能的程序时发现它与43楼的程序运行产生相同的结果,
于是,我就利用小数据文件跑了两个脚本,
实验数据.zip (238.23 KB, 下载次数: 1) 用stop_hbad1.txt去匹配文件blast_out01.txt发现结果相同[fly]是因为所有的结果都符合判断条件[/fly]
为了验证判断条件起作用了,我就将文件[/fly]blast_out01.txt中NP_415088.1-1中可以匹配输出的16732和16749行的Identities改成了85% 修改了Identities数据文件.zip (238.23 KB, 下载次数: 0)
结果发现两个脚本的效果仍然一样,

因此想问您一下,是程序的判断没有起作用吗?
过去了这么久还来麻烦您真是不还意思,您有时间帮忙看看,谢谢您O(∩_∩)O谢谢

修改了Identities数据文件.zip

238.22 KB, 下载次数: 0

论坛徽章:
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
64 [报告]
发表于 2017-02-09 11:58 |只看该作者
回复 62# little_joe
如果可以的话,麻烦再开新帖。(将你的处理要求描述清楚 列出期望的处理结果)

论坛徽章:
2
综合交流区版块每日发帖之星
日期:2016-07-06 06:20:00综合交流区版块每日发帖之星
日期:2016-08-16 06:20:00
65 [报告]
发表于 2017-02-09 12:00 |只看该作者
谦虚,是我描述的原因,我在组织组织语言,谢谢回复 5# sunzhiguolu

论坛徽章:
0
66 [报告]
发表于 2017-02-09 12:49 |只看该作者
回复 63# sunzhiguolu
好的,谢谢您

论坛徽章:
0
67 [报告]
发表于 2017-02-09 14:32 |只看该作者
回复 63# sunzhiguolu
刚才尝试着重新写个帖子,但是发现有些说不明白了,之前这个和您交流太多,这些问题要是都写上有些无从下手,您先看看,有问题再麻烦您问

论坛徽章:
0
68 [报告]
发表于 2017-02-12 10:16 |只看该作者
回复 60# sunzhiguolu

您好,上次问您的问题,运行60楼筛选与43楼不筛选的程序得到的结果一样,感觉这个判断写在了结果输出后面,不影响结果的输出,麻烦您能帮忙看一下是这样子的么?O(∩_∩)O谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP