我有两个文件如下:
文件#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