2014-09-25 5 views
5

गणना करने के लिए मैं निम्नलिखित के रूप में दो फ़ाइलें:दो फ़ाइलों में दो मिलान किया 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 

पहला कॉलम आईडी है और दूसरा कॉलम स्कोर है। मैं दोनों फाइलों में मिलान आईडी ढूंढने की कोशिश कर रहा हूं, और फिर फ़ाइल # 1 से अंतिम स्कोर (स्कोर 2 - स्कोर 1) की गणना # 2 में संबंधित स्कोर का उपयोग करें। निम्नलिखित परिणाम मैं चाहता है:

आउटपुट

C 1.1 
E -20.6 
A -5.48 

निम्न कोड के माध्यम से, मैं मिलान किया जा सकता था आईडी, लेकिन मैं पता नहीं कैसे फ़ाइल # 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}; 

} 

उत्तर

1

आपको अपनी पहली फ़ाइल को मुख्य मूल्य जोड़े के हैश में लोड करने की आवश्यकता है। फिर जब आप दूसरी फ़ाइल पर पुनरावृत्त करते हैं, तो आप जांच सकते हैं कि पिछली फ़ाइल में प्रत्येक कुंजी मौजूद है या नहीं।

निम्न स्क्रिप्ट तर्क का परीक्षण करने के लिए तारों को फ़ाइल हैंडल खोलती है। लेकिन आप अपनी लाइव स्क्रिप्ट के लिए फ़ाइलों को खोलने के लिए आसानी से वापस लौट सकते हैं।

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 
+0

धन्यवाद, Miler। हैश बहुत उपयोगी है। –

संबंधित मुद्दे