我有两个文件如下:
文件#1
A 20.68
B 17.5
C 15.6
D 20.6
E 27.6
Run Code Online (Sandbox Code Playgroud)
文件#2
C 16.7
X 2.9
E 7.0
A 15.2
Run Code Online (Sandbox Code Playgroud)
第一列是ID,第二列是得分.我试图在两个文件中找到匹配的ID,然后使用FILE#1中的相应分数计算FILE#2中的最终分数(Score2 - Score1).以下是我想要的结果:
OUTPUT
C 1.1
E -20.6
A -5.48
Run Code Online (Sandbox Code Playgroud)
通过以下代码,我可以获得匹配的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};
}
Run Code Online (Sandbox Code Playgroud)
您只需将第一个文件加载到键值对的哈希中。然后,当您迭代第二个文件时,您可以测试每个键是否存在于前一个文件中。
以下脚本打开字符串的文件句柄来测试逻辑。但您可以轻松恢复为实时脚本打开文件。
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};
}
Run Code Online (Sandbox Code Playgroud)
输出:
C 1.1
E -20.6
A -5.48
Run Code Online (Sandbox Code Playgroud)