如何使用PERL匹配列和计算百分比

时间:2013-12-11 13:52:30

标签: perl

我有这样的数据

pop A   B   C   D   E
P1  T/T C/C C/C T/T C/C
P2  A/A G/G C/C T/T C/C
1   A/A G/G C/C T/T C/C
2   A/A G/G C/C T/T C/C
3   A/T A/C A/G A/T A/C
4   T/A T/G T/C T/A T/G
5   G/A G/T G/C G/A G/T
6   C/A C/T C/G C/A C/T
pop A   B   C   D   E
P1  T/T C/C C/C T/T C/C
P2  A/A G/G C/C T/T C/C
1   A/A G/G C/C T/T C/C
2   A/A G/G C/C T/T C/C
3   A/T A/C A/G A/T A/C
4   T/A T/G T/C T/A T/G
5   G/A G/T G/C G/A G/T
6   C/A C/T C/G C/A C/T

我想在我的数据上做下面的事情

  1. 我想将所有A/A转换为A,将T/T转换为T,将C/C转换为C,{{1 } {} {}} {}} {}} {}} {}} {}} {}} {}} {}} {}} {} 1}},G/GG

  2. 现在,我想通过将Z/Z-进行比较来了解从-/--的状态,如果A/T则来自{{1} }} G/T是单字或C/GT/C中的任何一个包含HA,然后从EP1的状态}从P2P1=P2的其他状态是poly

  3. 如果A列中的1匹配,我想将E列中的1与P1P2的广告列中的Z/Z匹配到-/-列中的A并且其状态仅为多边形,然后我想提供1,否则,如果它是单声道,我不想做任何事情。

  4. 现在我将计算EA

  5. 最后,我将使用此公式E计算pop

  6. 我想对第二组父母P2A

  7. 重复相同的程序

    期待的将是这样的

    E

    现在我成功到第一步但不知道如何继续前进,这是我试过的代码

    pop

1 个答案:

答案 0 :(得分:1)

这会替换并创建前两行。我不明白规范的其余部分(第7行来自哪里?)

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

use Data::Dumper;


*ARGV = *DATA{IO} unless @ARGV;

my (@parents, @rows);

sub {
    my $header = <>;
    push @parents, map [ split ' ', <> ], 1, 2;
    push @rows,    map [ split ' ', <> ], 1 .. 6;
}->() for 1, 2;

for (map @$_, @parents, @rows) {
    s= ([ACTG]) / \1 =$1=x;
    s= ([-Z])   / \1 =-=x;
    s= .        / .  =H=x;
}

say join "\t", 'pop', ('A' .. 'E') x 2;

print 'P1';
for my $parent (0, 1) {
    print join "\t", q(), map {
        my $p1 = $parents[ $parent * 2 ][$_];
        my $p2 = $parents[ 1 + $parent * 2 ][$_];
        ($p1 eq $p2 or '-' eq $p1 or '-' eq $p2) ? 'mono' : 'poly';
    } 1 .. 5;
}
print "\n";


__DATA__
pop A   B   C   D   E
P1  T/T C/C C/C T/T C/C
P2  A/A G/G C/C T/T C/C
1   A/A G/G C/C T/T C/C
2   A/A G/G C/C T/T C/C
3   A/T A/C A/G A/T A/C
4   T/A T/G T/C T/A T/G
5   G/A G/T G/C G/A G/T
6   C/A C/T C/G C/A C/T
pop A   B   C   D   E
P1  T/T C/C C/C T/T C/C
P2  A/A G/G C/C T/T C/C
1   A/A G/G C/C T/T C/C
2   A/A G/G C/C T/T C/C
3   A/T A/C A/G A/T A/C
4   T/A T/G T/C T/A T/G
5   G/A G/T G/C G/A G/T
6   C/A C/T C/G C/A C/T