perl命令创建matrix.txt

时间:2018-08-05 09:35:00

标签: windows perl cmd

我从blast输出中得到一个txt文件,其中包含每个查询及其命中率,%身份和分数,我需要转换为矩阵文件以创建热图 我使用了这个长命令:

perl -we "while (<>) {chomp; @col = split /\t/; push @{$score{$col[0]}{$col[1]}}, $col[2], $col[3]}  @array = keys %score; print join "\t", "", @array, ""."\n"; foreach $key (keys %score) {print "$key\t";  foreach $hit (@array) {if ($score{$key}{$hit}) {print "$score{$key}{$hit}[0]\t" } else {print "\t"} } print "\n" }"

但是我得到一条评论:未加引号的字符串"t"可能与将来在-e第1行保留的单词冲突

生成的文件大小为0 KB

非常感谢您的帮助

1 个答案:

答案 0 :(得分:1)

您需要在各处将"..."替换为qq/.../,例如

"$score{$key}{$hit}[0]\t"

成为

qq/$score{$key}{$hit}[0]\t/

但是认真的说,这是一段很长的代码,很难写成一行。将其放入文件中,假设为matrix.pl,然后运行perl matrix.pl。这样,您阅读和编辑 会更容易,而其他人可以帮助您

这是代码的正确布局版本

matrix.pl

use strict;
use warnings 'all';

my %score;

while ( <> ) {
    chomp;
    my @col = split /\t/;
    push @{ $score{$col[0]}{$col[1]} }, $col[2], $col[3];
}

my @keys = keys %score;

print join "\t", "", @keys, "" . "\n";

for my $key ( @keys ) {

    print "$key\t";

    for my $hit ( @keys ) {

        if ( $score{$key}{$hit} ) {
            print "$score{$key}{$hit}[0]\t";
        }
        else {
            print "\t";
        }
    }

    print "\n";
}