- 论坛徽章:
- 307
|
本帖最后由 sunzhiguolu 于 2016-06-18 19:51 编辑
回复 29# little_joe
之前那个, 在判断逻辑上有点偏差, 再试下,- #!/usr/bin/perl
- use strict;
- use warnings;
- sub collect_data{
- my (%ha, %hFilt, $id);
- open (my $fhA, '<', shift);
- while (defined (local $_ = <$fhA>)){
- if (/\A(\D\S+)/){
- %hFilt = () if (!exists $ha{$1});
- $id = $1;
- next;
- }
- s/\s+\z//;
- push (@{$ha{$id}}, $_) if (!$hFilt{$_}++);
- }
- 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 @aChars = split (//, $V->[4]);
- next if ($aChars[$v - $V->[0]] eq '-');
- $hStat{$aChars[$v - $V->[0]]}++;
- }
- }
- 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(?:Query|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);
复制代码 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
|
|