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

我有两个文件如下:

文件#1

A 20.68
B 17.5
C 15.6
D 20.6
E 27.6

文件#2

C   16.7
X   2.9
E   7.0
A   15.2

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

OUTPUT

C 1.1
E -20.6
A -5.48

通过以下代码,我可以获得匹配的ID,但我不知道如何调用FILE#2中的相应分数来在FILE#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};

}

解决方法

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

以下脚本打开字符串的文件句柄以测试逻辑.但是您可以轻松地恢复为您的实时脚本打开文件.

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

相关文章

1. 如何去重 #!/usr/bin/perl use strict; my %hash; while(...
最近写了一个perl脚本,实现的功能是将表格中其中两列的数据...
表的数据字典格式如下:如果手动写MySQL建表语句,确认麻烦,...
巡检类工作经常会出具日报,最近在原有日报的基础上又新增了...
在实际生产环境中,常常需要从后台日志中截取报文,报文的形...
最近写的一个perl程序,通过关键词匹配统计其出现的频率,让...