在命令行上创建哈希后,将哈希打印到输出文件中

时间:2015-06-28 17:41:37

标签: perl output hash

我正在尝试使用创建的哈希并将结果提取到输出文件中。我的脚本在下面。任何帮助将不胜感激。欢呼声。

first_file数据的样本

>nameID ABCD

second_file数据的样本

>nameID 0.5

我的Perl代码

my ( $first_file, $second_file ) = @ARGV;

my %name;

{
    open my $fh, '<', $first_file or die qq{Unable to open "$first_file": $!};

    my $key;
    while ( <$fh> ) {
        if ( /^>(\S+)/ ) {
            $key = $1;
        }
        elsif ( /\S/ ) {
            chomp;
            $name{$key} .= $_;
        }
    }
}

open my $fh, '<', $second_file or die qq{Unable to open "$second_file": $!};
while ( <$fh> ) {
    if ( /^>(\S+)/ ) {
        printf "%s\t%s\n", $1, $name{$1} // 'undef';
    }
}

我遇到的麻烦是将printf "%s\t%s\n", $1, $name{$1} // 'undef'从命令行解压缩到输出文件中。

2 个答案:

答案 0 :(得分:0)

尝试以下方法。我已经改变了你的正则表达式。请注意,我假设您的行以&#34;&gt;&#34;开头。角色,&#34; - &#34;你在你的例子中使用过的(否则,你的正则表达式需要以/^-->开头。

#!/usr/bin/perl
use warnings;
use strict;

my ( $first_file, $second_file ) = @ARGV;
my $write_file = 'output.txt';

my %name;

open my $fh1, '<', $first_file
  or die qq{Unable to open "$first_file": $!};

while ( <$fh1> ) {
    s/,//;
    if ( /^>\s+(\S+)\s+(\S+)/ ) {
        $name{$1} = $2;
    }
}
close $fh1;

open my $fh2, '<', $second_file
  or die qq{Unable to open "$second_file": $!};

open my $wfh, '>', $write_file
  or die "Unable to open write file $write_file: $!";

while ( <$fh2> ) {
    s/,//;
    if ( /^>\s+(\S+)/ ) {
        printf $wfh "%s\t%s\n", $1, $name{$1} // 'undef';
    }
}

close $fh2;
close $wfh;

输入文件1:

> 1, ABCD
> 2, XFSD
> 3, GDWE
> 4, MMDD

输入文件2:

> 1, 0.5
> 4, 9.99
> 6, 22.22

输出文件:

1   ABCD
4   MMDD
6   undef

答案 1 :(得分:0)

将输出重定向到文件所需要做的就是在命令行中指定它

program.pl file1.txt file2.txt > output.txt

我建议您这样做,以便您可以选择输出的位置,而无需编辑程序