Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在两个文件中找到两个匹配的ID,然后使用它们的值进行计算_Perl - Fatal编程技术网

Perl 如何在两个文件中找到两个匹配的ID,然后使用它们的值进行计算

Perl 如何在两个文件中找到两个匹配的ID,然后使用它们的值进行计算,perl,Perl,我有两个文件,如下所示: 文件#1 文件#2 第一列是ID,第二列是score。我试图在两个文件中找到匹配的ID,然后使用文件#1中相应的分数计算文件#2中的最终分数(Score2-Score1)。以下是我想要的结果: 输出 C 1.1 E -20.6 A -5.48 通过下面的代码,我可以得到匹配的ID,但我不知道如何从文件#2调用相应的分数来在文件#2中进行计算。非常感谢您的帮助 open my $A, 'list1.txt'; open my $B, 'list2.txt'; my $h

我有两个文件,如下所示:

文件#1

文件#2

第一列是ID,第二列是score。我试图在两个文件中找到匹配的ID,然后使用文件#1中相应的分数计算文件#2中的最终分数(Score2-Score1)。以下是我想要的结果:

输出

C 1.1
E -20.6
A -5.48
通过下面的代码,我可以得到匹配的ID,但我不知道如何从文件#2调用相应的分数来在文件#2中进行计算。非常感谢您的帮助

open my $A, 'list1.txt';
open my $B, 'list2.txt';
my $h;
map { chomp; $h{(split /\s+/)[0]} ++} <$A>;


while (<$B>) {
    my @split = split(/\s+/,$_);
    my $ID = $split[0];
    my $score = $split[1];
    print "$ID\t$score\n" if $h{$ID};

}
打开我的$A,'list1.txt';
打开我的$B,‘list2.txt’;
我的$h;
map{chomp;$h{(split/\s+/)[0]}++};
而(){
my@split=split(/\s+/,$);
my$ID=$split[0];
我的$score=$split[1];
如果$h{$ID},则打印“$ID\t$score\n”;
}

您只需要将第一个文件加载到键值对的散列中。然后在第二个文件上迭代时,可以测试前一个文件中是否存在每个密钥

以下脚本打开字符串的文件句柄以测试逻辑。但是,您可以轻松地恢复到打开live脚本的文件

use strict;
use warnings;
use autodie;

my %score1 = do {
    #open my $fh1, '<', 'list1.txt';
    open my $fh1, '<', \ "A 20.68\nB 17.5\nC 15.6\nD 20.6\nE 27.6\n";
    map {chomp; split ' ', $_, 2} <$fh1>;
};

#open my $fh2, '<', 'list2.txt';
open my $fh2, '<', \ "C   16.7\nX   2.9\nE   7.0\nA   15.2";

while (<$fh2>) {
    chomp;
    my ($key, $score) = split ' ';
    printf "%s %s\n", $key, $score - $score1{$key} if exists $score1{$key};
}

谢谢你,米勒。哈希非常有用。
open my $A, 'list1.txt';
open my $B, 'list2.txt';
my $h;
map { chomp; $h{(split /\s+/)[0]} ++} <$A>;


while (<$B>) {
    my @split = split(/\s+/,$_);
    my $ID = $split[0];
    my $score = $split[1];
    print "$ID\t$score\n" if $h{$ID};

}
use strict;
use warnings;
use autodie;

my %score1 = do {
    #open my $fh1, '<', 'list1.txt';
    open my $fh1, '<', \ "A 20.68\nB 17.5\nC 15.6\nD 20.6\nE 27.6\n";
    map {chomp; split ' ', $_, 2} <$fh1>;
};

#open my $fh2, '<', 'list2.txt';
open my $fh2, '<', \ "C   16.7\nX   2.9\nE   7.0\nA   15.2";

while (<$fh2>) {
    chomp;
    my ($key, $score) = split ' ';
    printf "%s %s\n", $key, $score - $score1{$key} if exists $score1{$key};
}
C 1.1
E -20.6
A -5.48