2014-09-25 8 views
5

Ho due file come segue:Come trovare due abbinati ID in due file, e quindi utilizzare i loro valori per calcolare

FILE # 1

A 20.68 
B 17.5 
C 15.6 
D 20.6 
E 27.6 

FILE # 2

C 16.7 
X 2.9 
E 7.0 
A 15.2 

La prima colonna è ID e la seconda colonna è il punteggio. Sto cercando di trovare gli ID corrispondenti in entrambi i file e quindi utilizzare i punteggi corrispondenti da FILE # 1 per calcolare il punteggio finale (Punteggio2 - Punteggio1) nel FILE # 2. Quello che segue è il risultato che voglio:

USCITA

C 1.1 
E -20.6 
A -5.48 

Attraverso seguente codice, ho potuto ottenere abbinato ID, ma non ho idea di come chiamare i punteggi corrispondenti da FILE # 2 di fare calcoli in FILE # 2. Il tuo aiuto sarà molto apprezzato!

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}; 

} 

risposta

1

È sufficiente caricare il primo file in un hash di coppie di valori chiave. Quindi, quando si esegue iterazione sul secondo file, è possibile verificare se ciascuna chiave esiste nel file precedente.

Il seguente script apre i manici dei file alle stringhe per testare la logica. Ma puoi tornare facilmente ad aprire i file per il tuo live script.

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}; 
} 

Uscite:

C 1.1 
E -20.6 
A -5.48 
+0

Grazie, Miler. Hash è molto utile. –

Problemi correlati