免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: little_joe
打印 上一主题 下一主题

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

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
31 [报告]
发表于 2016-06-18 19:26 |只看该作者
听你这么说,貌似我就是这么处理的。。。要不验证一下结果
anyway我就是给个代码思路,毕竟需求会变的 回复 30# 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
32 [报告]
发表于 2016-06-18 19:41 |只看该作者
本帖最后由 sunzhiguolu 于 2016-06-18 19:51 编辑

回复 29# little_joe
之前那个, 在判断逻辑上有点偏差, 再试下,
  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(\D\S+)/){
  9.             %hFilt = () if (!exists $ha{$1});
  10.             $id = $1;
  11.             next;
  12.         }
  13.         s/\s+\z//;
  14.         push (@{$ha{$id}}, $_) if (!$hFilt{$_}++);
  15.     }
  16.     close ($fhA);
  17.     \%ha;
  18. }

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

  35. my $rha = collect_data (shift);

  36. open (my $fh, '<', shift);
  37. my ($Flag, $Offset, $ID, @aData) = 0;
  38. while (defined (local $_ = <$fh>)){
  39.     next if (/\A\s*\z/ or !/\A(?:Query|Sbjct)/);
  40.     if (/\AQuery=\h+(\S+)/){
  41.         compare ($ID, $rha, splice (@aData)) if (@aData);
  42.         exists ($rha->{$1}) ? do {($ID, $Flag, $Offset) = ($1, 1, -1)} : ($Flag = 0);
  43.         next;
  44.     }
  45.     next if (!$Flag);
  46.     if (/\A(Query|Sbjct)\h+(\d+)\h+(\H+)\h+(\d+)/){
  47.         push (@{$aData[$1 eq "Query" ? ++$Offset : $Offset]}, $2, $3, $4);
  48.     }
  49. }
  50. close ($fh);
  51. compare ($ID, $rha, splice (@aData)) if ($Flag);
复制代码
perl abc.pl a b
-------------------------------
NP_415088.1-1   W:4
NP_415560.1-1   S:1
YP_025310.1-1   T:1     V:1
YP_588459.1-1   N:1     K:1
YP_002791252.1-1        S:1
NP_418697.1-1   E:7     W:7


   

论坛徽章:
0
33 [报告]
发表于 2016-06-18 20:16 |只看该作者
本帖最后由 little_joe 于 2016-06-18 20:24 编辑

再次感谢,试了您刚才的代码,结果如图 但是YP_025310.1-1   T:1     V:1结果不太对,原因可能是将Query中的“-”当成字母读取了,文件中当Query行中出现“-”时不会影响序号区间例如:Query:1 ASDFGHJKL 9和Query:1  ASD-FGHJKL 9它们两个都是包含9个元素,“-”不会影响字母的序号例如:Query:1 ASD-FGHJKL 9
                 Sbjct:1 ASDFGHHLKJ 9假设文件A数值为4,则找到了Query行的F此时Sbjct行对应G的回复 32# sunzhiguolu


   

论坛徽章:
0
34 [报告]
发表于 2016-06-18 20:24 |只看该作者
试了您刚才的代码,结果是这样的 不知道什么原因。请教请教!回复 31# stanley_tam


   

论坛徽章:
6
丑牛
日期:2014-03-21 15:42:04子鼠
日期:2014-04-12 11:50:17处女座
日期:2014-09-01 09:25:1115-16赛季CBA联赛之吉林
日期:2015-12-22 14:01:5215-16赛季CBA联赛之广东
日期:2016-03-08 18:49:422016科比退役纪念章
日期:2016-07-06 12:19:55
35 [报告]
发表于 2016-06-18 21:11 |只看该作者
我的代码直接跑perl fii.pl(如果文件名字是fii.pl的话)
pl文件跟 A.word   B.word放在同一个目录下。。。估计你得把文件名字重命名,或者修改main函数中的文件名字。
回复 34# 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
36 [报告]
发表于 2016-06-18 21:19 |只看该作者
本帖最后由 sunzhiguolu 于 2016-06-18 21:30 编辑

回复 33# little_joe
对于 Query 行的 '-' 字符 在什么情况下 会对 Query 行产生影响? (针对 B 文件)
举例如下:
A 文件:
YP_025310.1-1
73
78

B 文件:
Query= YP_025310.1-1
...
Query  59   FSGDMLPDGGINRRWLTPA-SKLRQPVVCLNRSGNMVGQSVLPMAG-LSGKKKATKNSLF  116
              G       IN R  T A S++ +P+          G+++    G    KK+  KNSL
Sbjct  61   APGWWDKPPLINARVETAATSRMFKPLW-------QHGRAICFADGWFEWKKEGDKNSLI  113
...

符合 A 文件中数值 73, 78 条件的只有这两条记录. (Query 59, Sbjct 61)

1.> 假设 Query 59 这一行, 在 73 之前的位置出现了两个 '-' 字符, 那么 Query 59 这行的 73 数值应该落在那个字符上面?  (你在说明时, 请使用同一示例文件进行说明)
2.> 还是只考虑 当 A 中 数值 (如: 78 ) 在 B Query 行正好处于 '-' 位置时才顺延到下一个字符, 其他情形忽略.

   

论坛徽章:
0
37 [报告]
发表于 2016-06-18 21:22 |只看该作者
试了,是刚才运行的方式不对,谢谢!!回复 35# stanley_tam


   

论坛徽章:
0
38 [报告]
发表于 2016-06-18 21:32 |只看该作者
本帖最后由 little_joe 于 2016-06-18 21:34 编辑

对于您的疑问
Query= YP_025310.1-1
...
Query  59   FSGDML--PDGGINRRWLTPA-SKLRQPVVCLNRSGNMVGQSVLPMAG-LSGKKKATKNSLF  116
              G       IN R  T A S++ +P+          G+++    G    KK+  KNSL
Sbjct  61   APGWWDKPPLINARVETAATSRMFKPLW-------QHGRAICFADGWFEWKKEGDKNSLI  113
...
如果Query行在73之前出现两个“--”则73位还是W,但是对应的Sbjct是不同的。因为-在Query行中出现其实是运行软件加注的Gap,不是序列中的内容,而Query和Sbjct前后的数字是指序列序号,也就是字母的序号,与“-”无关。
例如:
Query  58   VSKWVWKRGWPSSSSNRRKPAVTSRKLTCWDARLNGWRGSTATVRPATRQT-----LIRT  112
            V  W  + GW S +   R       +LT    +     G    +    RQ      + R
Sbjct  15   VQSWKQRDGWDSVAPISRVEMSLEARLTQLIIKPQKTGGDFKEIDLLGRQIERLARVNRY  74

Query  113  SLTATKAG----VANR--------KRIFSVTRPSKSWSRFSLSSLSTISCTGIAPGLSTA  160
            S T  +A     VANR        K+ FSVTRPSKSWSRFSLSSLS ISCTGIAPGLSTA
Sbjct  75   SQTGNEADLNPNVANRNKGGRRKPKKNFSVTRPSKSWSRFSLSSLSIISCTGIAPGLSTA  134

Query  161  SAIS  164
            SAIS
Sbjct  135  SAIS  138
虽然第一行Query和第3行Query均有“-”出现,但其序列编号并未将其包含在内。回复 36# 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
39 [报告]
发表于 2016-06-19 11:47 |只看该作者
回复 38# little_joe
对于这种情况, B 文件 如何取值? (A 文件的数值:81)
Query= NP_418697.1-1
...
Query  34   NNICERAIRPVVMGRKAWLFAGSLVAGNRAAQIMSLLGT---------AVWSHMLGWRTS  84
            NNI E A+R V +GRK +LF GS   G R A + SL+GT         +   H+LG   
Sbjct  57   NNIAENALRAVSLGRKNFLFFGSDHGGERGALLYSLIGTCKLNDVDPESYLRHVLGVIAD  116

Query 34 行 应该落在那个字符上面, Sbjct 57 行 应该落在那个字符上面

   

论坛徽章:
0
40 [报告]
发表于 2016-06-19 12:02 |只看该作者
本帖最后由 little_joe 于 2016-06-19 12:07 编辑

Query= NP_418697.1-1
...
Query  34   NNICERAIRPVVMGRKAWLFAGSLVAGNRAAQIMSLLGT---------AVWSHMLGWRTS  84
            NNI E A+R V +GRK +LF GS   G R A + SL+GT         +   H+LG   
Sbjct  57   NNIAENALRAVSLGRKNFLFFGSDHGGERGALLYSLIGTCKLNDVDPESYLRHVLGVIAD  116
文件A是81的话,Query行取值应该为W,Sbjct行则取对应的V,谢谢您。
也就是说当Query行出现“-”不会影响数值匹配,但是如果Sbjct行出现“-”则Query对应的Sbjct则会发生变化回复 39# sunzhiguolu


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP