免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5199 | 回复: 15
打印 上一主题 下一主题

perl新手求教...求教......文件匹配输出指定内容,非常感谢 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-08-17 16:52 |只看该作者 |倒序浏览
perl新手求教...求教......文件匹配输出指定内容,非常感谢

文件a:
WP_001198722.1;YP_026238.1;
37
126

WP_000075876.1;
58
204
WP_000072067.1;YP_026241.1;
42
50
WP_000077872.1;YP_025308.1;
128
201
文件b:
>lcl|NC_012947.1_prot_WP_001198722.1_11 [gene=ECBD_RS00055] [protein=/inference=EXISTENCE: similar to AA sequence:RefSeq:WP_001198703.1; catalyzes the formation of D-glyceraldehyde 3-phosphate an>] [protein_id=WP_001198722.1] [location=10464..11081]
MQWQTKLPLIAILRGITPDEALAHVGAVIDAGFDAVEIPLNSPQWEQSIPAIVDAYGDKALIGAGTVLKP
EQVDALARMGCQLIVTPNIHSEVIRRAVGYGMTVCPGCATATEAFTALEAGAQALKIFPSSAFGPQYIKA
LKAVLPSDIAVFAVGGVTPENLAQWIDAGCAGAGLGSDLYRAGQSVERTAQQAAAFVKAYREAVQ
>lcl|NC_012947.1_prot_WP_000072067.1_4 [gene=gyrB] [protein=/inference=EXISTENCE: similar to AA sequence:RefSeq:WP_001341774.1; negatively supercoils closed circular double-stranded DNA] [protein_id=WP_000072067.1] [location=3957..6371]
MSNSYDSSSIKVLKGLDAVRKRPGMYIGDTDDGTGLHHMVFEVVDNAIDEALAGHCKEIIVTIHADNSVS
VQDDGRGIPTGIHPEEGVSAAEVIMTVLHAGGKFDDNSYKVSGGLHGVGVSVVNALSQKLELVIQREGKI
HRQIYEHGVPQAPLAVTGETEKTGTMVRFWPSLETFTNVTEFEYEILAKRLRELSFLNSGVSIRLRDKRD
GKEDHFHYEGGIKAFVEYLNKNKTPIHPNIFYFSTEKDGIGVEVALQWNDGFQENIYCFTNNIPQRDGGT
HLAGFRAAMTRTLNAYMDKEGYSKKAKVSATGDDAREGLIAVVSVKVPDPKFSSQTKDKLVSSEVKSAVE
QQMNELLAEYLLENPTDAKIVVGKIIDAARAREAARRAREMTRRKGALDLAGLPGKLADCQERDPALSEL
YLVEGDSAGGSAKQGRNRKNQAILPLKGKILNVEKARFDKMLSSQEVATLITALGCGIGRDEYNPDKLRY
HSIIIMTDADVDGSHIRTLLLTFFYRQMPEIVERGHVYIAQPPLYKVKKGKQEQYIKDDEAMDQYQISIA
LDGATLHTNASAPALAGEALEKLVSEYNATQKMINRMERRYPKAMLKELIYQPTLTEADLSDEQTVTRWV
NALVSELNDKEQHGSQWKFDVHTNAEQNLFEPIVRVRTHGVDTDYPLDHEFITGGEYRRICTLGEKLRGL
LEEDAFIERGERRQPVASFEQALDWLVKESRRGLSIQRYKGLGEMNPEQLWETTMDPESRRMLRVTVKDA
IAADQLFTTLMGDAVEPRRAFIEENALKAANIDI
>lcl|NC_012947.1_prot_WP_000772941.1_8 [gene=ECBD_RS00040] [protein=/inference=EXISTENCE: similar to AA sequence:RefSeq:WP_001176565.1] [protein_id=WP_000772941.1] [location=complement(7982..863]
MKLNFKGFFKAAGLFPLALMLSGCISYALVSHTAKGSSGKYQSQSDTITGLSQAKDSNGTKGYVFVGESL
DYLITDGADDIVKMLNNPALNRHNIQVADDARFVLNAGKKKFTGTISLYYYWNNEEEKALATHYGFACGV
QHCTRSLENLKGTIHEKNKNMDYSKVMAFYHPFKVRFYEYYSPRGIPDGVSAALLPVTVTLDIITAPLQF,
LVVYAVNQ
如上,文件a中的WP_001198722.1匹配到文件b中的WP_001198722.1(均用红色注明)
则用文件a:WP_001198722.1下面的数字37,126查找文件b中的序列,序列的开头为青色标明处(该处序号记为1)
文件b每个以>lcl开头的为一条完整的注释序列,
图中橙色的部分为注释信息(需要用文件a的WP_001198722.1匹配文件b注释信息中的WP_001198722.1),
下面的大写字母为序列信息,即需要进行序号匹配的内容,例如WP_001198722.1下的37,126分别对应文件b中的E,K,

输出结果:
WP_001198722.1 E:1 K:1
WP_000072067.1 E:2
即对匹配到的序号输出的字母进行计数;
谢谢您的关注及帮助;

论坛徽章:
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
2 [报告]
发表于 2016-08-17 19:48 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($id, %hData, %hCnt);
  5. open (my $FHa, '<', './a');
  6. while (defined (local $_ = <$FHa>)){
  7.     if (/\A(WP_[^;]+)/){
  8.         $id = $1;
  9.         next;
  10.     }
  11.     chomp;
  12.     push (@{$hData{$id}}, $_);
  13. }
  14. close ($FHa);

  15. open (my $FHb, '<', './b');
  16. local $/ = ">lcl";
  17. while (defined (local $_ = <$FHb>)){
  18.     chomp;
  19.     next if (/\A\s*\z/);
  20.     my @aLines = split (/\n/);
  21.     if ($aLines[0] =~ /(WP_[\d.]+)/ and exists $hData{$1}){
  22.         my $context = join ("", @aLines[1 .. $#aLines]);
  23.         $hCnt{substr ($context, $_ - 1, 1)}++ for @{$hData{$1}};
  24.         my @aK2V = map {"$_:$hCnt{$_}"} keys %hCnt;
  25.         print "$1 @aK2V\n";
  26.         %hCnt = ();
  27.     }
  28. }
  29. close ($FHb);
复制代码

论坛徽章:
0
3 [报告]
发表于 2016-08-18 07:55 |只看该作者
非常感谢您的帮助,我将您写的代码命名为new1.txt,用事例运行之后出现这样的提示 ,没有看懂,希望您能帮忙解答一下,另外那个b文件实际上特别大的,这样会影响代码运行么? 回复 2# 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
4 [报告]
发表于 2016-08-18 11:39 |只看该作者
你的测试环境是啥呀?

论坛徽章:
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
5 [报告]
发表于 2016-08-18 12:56 |只看该作者
再试下,
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($id, %hData, %hCnt);
  5. open (my $FHa, '<', shift);
  6. while (defined (local $_ = <$FHa>)){
  7.     if (/\A(WP_[^;]+)/){
  8.         $id = $1;
  9.         next;
  10.     }
  11.     s/\A\s+|\s+\z//g;
  12.     push (@{$hData{$id}}, $_);
  13. }
  14. close ($FHa);

  15. open (my $FHb, '<', shift);
  16. local $/ = ">lcl";
  17. while (defined (local $_ = <$FHb>)){
  18.     chomp;
  19.     next if (!length);
  20.     my @aLines = split (/\r?\n/);
  21.     if ($aLines[0] =~ /(WP_[\d.]+)/ and exists $hData{$1}){
  22.         my $context = join ("", @aLines[1 .. $#aLines]);
  23.         $hCnt{substr ($context, $_ - 1, 1)}++ for @{$hData{$1}};
  24.         my @aK2V = map {"$_:$hCnt{$_}"} keys %hCnt;
  25.         %hCnt = ();
  26.         print "$1 @aK2V\n";
  27.     }
  28. }
  29. close ($FHb);
复制代码
perl abc.pl a.txt b.txt
---------------------------------------------------------------------------
WP_001198722.1 K:1 E:1
WP_000072067.1 E:2

论坛徽章:
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
6 [报告]
发表于 2016-08-18 13:00 |只看该作者
open (my $FHa, '<', './a');

我的上个代码将文件路径写死了, 改成 shift 就可以了!

论坛徽章:
0
7 [报告]
发表于 2016-08-18 17:11 |只看该作者
恩恩,谢谢您的热情帮助,有问题再问您,再次感谢 回复 6# sunzhiguolu


   

论坛徽章:
0
8 [报告]
发表于 2016-08-18 17:12 |只看该作者
应该是UNIX的回复 4# 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
9 [报告]
发表于 2016-09-01 22:58 |只看该作者
本帖最后由 sunzhiguolu 于 2016-09-01 23:52 编辑

还真是有点记不住题目的要求,

论坛徽章:
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
10 [报告]
发表于 2016-09-01 23:02 |只看该作者
本帖最后由 sunzhiguolu 于 2016-09-01 23:49 编辑

试下,
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ($id, %hData, %hCnt);
  5. open (my $FHr, '<', shift);
  6. while (local $_ = <$FHr>){
  7.     s/\s+\z//;
  8.     next if (!length);
  9.     if (/\A([a-z]+_[^;]+)/i){
  10.         $id = $1;
  11.         next;
  12.     }
  13.     push (@{$hData{$id}}, $_);
  14. }
  15. close ($FHr);

  16. local $/ = '>';
  17. open ($FHr, '<', shift);
  18. while (local $_ = <$FHr>){
  19.     chomp;
  20.     next if (!length);
  21.     my @aSeq = split (/-\d+;\r?\n/);
  22.     next if (!exists $hData{$aSeq[0]});
  23.     print $aSeq[0];
  24.     $hCnt{substr ($aSeq[-1], $_ - 2, 1)}++ for @{$hData{$aSeq[0]}};
  25.     print "\t$_:$hCnt{$_}" for keys %hCnt;
  26.     print "\n";
  27.     %hCnt = ();
  28. }
  29. close ($FHr);
复制代码
perl abc.pl a b
------------------------------------
NP_414552.1     *:1
NP_414557.1     R:1
NP_414562.1     A:1     M:12


评分

参与人数 1信誉积分 +20 收起 理由
little_joe + 20 灰常感谢!!!

查看全部评分

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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP