繁体   English   中英

Perl:对于哈希打印中的每个键,第一个值是…,在下一个循环中是第二个,依此类推

[英]Perl: For each key in hash printing the first value…in the next loop the second and so on

所以,

我将大量具有生物学序列的.txt文件数据输入到我的@col数组中...我需要每个位置出现几个字母(A,C,G,T)的频率...一切都很好。它可以工作,但我想像这样转置输出...

输出为:

A 1.112 1.124 1.258

C 1.154 1.122 1.587

G 1.158 1.454 1.478

电话1.154 1.125 1.478

但是我想转置...我的意思是将行变成列...

交流GT

1.112 1.154 1.154 1.154

等等

编码:

@col = {GTGTCCATTAGAGGGCGCCA GCAGCCTCCTGAGGACGCCA GAGACCTCAAGGGGCCACTA GGGGCCACTAGGGGGCTCGA ATGGCCACAAGAGGGCGTCA CTGCCCGCCCGGCGGCGCCG GCGGGCAGCAGGGGGAGCCG ATCACCACCAGGTGGCGCCG AAGGACACTAGGTGGAGCCA TCGGCCGGCAGAGGGCGCTG ATGACCGCCAGGGGTCGCTC ACCACCAGCAGGGGGCACCT GCAGCCCGTGGGGGGCGCCG GTGGGCGGCAGGGGGCGCTG CCAGCCTCTAGGGGCCACTG TTGACCACCAGATGGTGGTA CCTGCCGAAAGGGGGCAGTG and so on }

foreach my $row(@col)
  {       
   ++$pwm{ substr $row, $_, 1 }[ $_ ] for 0 .. length( $row ) -1;  #holt die Teilstrings aus der Zeile, sprich Pos 1, Pos2....
  }
  @col=();  # benoetige leeres array fuer oben
  @$_ = map{ $_ ? ($_/$row_counter)+1 : 1 } @$_ for values %pwm;

 print "$_ @{ $pwm{$_}}\n" for sort keys %pwm;

这似乎可以满足您的需求,尽管令您惊讶的是您希望频率从1到2而不是从0到1变化

use strict;
use warnings 'all';

my @col = qw/
    GTGTCCATTAGAGGGCGCCA
    GCAGCCTCCTGAGGACGCCA
    GAGACCTCAAGGGGCCACTA
    GGGGCCACTAGGGGGCTCGA
    ATGGCCACAAGAGGGCGTCA
    CTGCCCGCCCGGCGGCGCCG
    GCGGGCAGCAGGGGGAGCCG
    ATCACCACCAGGTGGCGCCG
    AAGGACACTAGGTGGAGCCA
    TCGGCCGGCAGAGGGCGCTG
    ATGACCGCCAGGGGTCGCTC
    ACCACCAGCAGGGGGCACCT
    GCAGCCCGTGGGGGGCGCCG
    GTGGGCGGCAGGGGGCGCTG
    CCAGCCTCTAGGGGCCACTG
    TTGACCACCAGATGGTGGTA
    CCTGCCGAAAGGGGGCAGTG
/;

my %pwm;

for ( @col ) {

    my @row = split //;  #/

    for my $i ( 0 .. $#row ) {
        my $k = $row[$i];
        ++$pwm{$k}[$i];
    }
}

for my $counts ( values %pwm ) {
    for my $count ( @$counts ) {
        $count = ( $count // 0) / @col + 1;
    }
}

my @keys = sort keys %pwm;

my $fmt = '%-5s ' x @keys . "\n";
printf $fmt, @keys;

$fmt = '%.3f ' x @keys . "\n";

for my $i ( 0 .. @col ) {
    printf $fmt, map { $pwm{$_}[$i] } @keys;
}

输出

A     C     G     T     
1.294 1.176 1.412 1.118 
1.118 1.412 1.059 1.412 
1.176 1.118 1.647 1.059 
1.294 1.059 1.588 1.059 
1.059 1.824 1.118 1.000 
1.000 2.000 1.000 1.000 
1.471 1.059 1.294 1.176 
1.059 1.588 1.294 1.059 
1.176 1.529 1.000 1.294 
1.824 1.059 1.059 1.059 
1.000 1.000 2.000 1.000 
1.294 1.000 1.706 1.000 
1.000 1.059 1.765 1.176 
1.000 1.000 2.000 1.000 
1.059 1.118 1.765 1.059 
1.118 1.824 1.000 1.059 
1.235 1.000 1.706 1.059 
1.000 1.824 1.118 1.059 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM