2017-02-10 119 views
0

我是perl的新手,發現這很難處理perl下面的情況和hash概念。我發現一些輸入來處理這種情況,但沒有安裝Text:CSV模塊。Perl hash:基於另一個文件的key打印文件列

#/usr/bin/perl -w 
use strict; 
use warning; 
use Data::Dumper; 

my $INFILE_01 = "FILE_01.txt"; 
my $INFILE_02 = "FILE_02.txt"; 

open INFILE02, "< $INFILE_02" or die "$0 : Failed to open input file $INFILE_02 : $! \n"; 
# Format of INFILE02 - Tab Delimited 
DEVELOMENT_TEST BUGID_TS57 TestID 
DEVELOMENT_UAT BUGID_TS57 TestID 
DEVELOMENT_PROD BUGID_TS57 TestID 
DEVELOMENT_REG BUGID_TS57 TestID 
DEVELOMENT_TEST BUGID_TS57 TestID 
DEVELOMENT_TEST BUGID_TS57 TestID 
DEVELOMENT_UAT BUGID_TS57 TestID 
my %INFILE02; 

while (my $line = <INFILE02>) { 
    # Skipping if the line is empty or a comment 
    next if ($line =~ /^\s*$/); 
    next if ($line =~ /^#\s*/); 
    chomo $line; 

    if ($line = ~ /MOBILE_DEV/) { 
     my ($colum1, $column2, undef) = split /\t/, $line; 
     $INFILE02{$colum1} = $colum2; 
    } 

} 
close $INFILE02 or die "$0 : Failed to close input file $INFILE02 : $! \n"; 
print Dumper \%INFILE02; 

# Output of %INFILE02 
$VAR1 = { 
     'DEVELOMENT_TEST' => 'BUGID_TS57', 
     'DEVELOMENT_UAT' => 'BUGID_TS57', 
     'DEVELOMENT_PROD' => 'BUGID_TS57', 
     'DEVELOMENT_REG' => 'BUGID_TS57' 
} 
從上方INFILE02的散列輸出

現在我需要匹配的鑰匙DEVELOMENT_TEST,DEVELOMENT_UAT,DEVELOMENT_PROD,DEVELOMENT_REG到文件INFILE01在每一行逐個。

對於如果在INFILE01的任何行上存在密鑰DEVELOMENT_TEST,則將INFILE01的第1列第3列和INFILE02的所有列都打印到輸出文件。

我需要對%INFILE02的所有鍵重複此操作。

#Format of INFILE001 - Tab Delimited 
119736 PRODUCTTESTING DEVELOMENT_TEST 
448094 PRODUCTTESTING DEVELOMENT_TEST 
206893 PRODUCTTESTING DEVELOMENT_TEST 
333743 PRODUCTTESTING DEVELOMENT_TEST 
172534 PRODUCTTESTING DEVELOMENT_PROD 
785275 PRODUCTTESTING DEVELOMENT_PROD 
995932 PRODUCTTESTING DEVELOMENT_PROD 
223488 PRODUCTTESTING DEVELOMENT_TEST 
433512 PRODUCTTESTING DEVELOMENT_TEST 
640802 PRODUCTTESTING DEVELOMENT_PROD 
403866 PRODUCTTESTING DEVELOMENT_UAT 
828788 PRODUCTTESTING DEVELOMENT_UAT 
751490 PRODUCTTESTING DEVELOMENT_UAT 
972562 PRODUCTTESTING DEVELOMENT_UAT 
367541 PRODUCTTESTING DEVELOMENT_REG 
481360 PRODUCTTESTING DEVELOMENT_REG 
920232 PRODUCTTESTING DEVELOMENT_UAT 

所需的輸出應該如下:

119736 DEVELOMENT_TEST BUGID_TS57 TestID 
448094 DEVELOMENT_TEST BUGID_TS57 TestID 
206893 DEVELOMENT_TEST BUGID_TS57 TestID 
333743 DEVELOMENT_TEST BUGID_TS57 TestID 
223488 DEVELOMENT_TEST BUGID_TS57 TestID 
433512 DEVELOMENT_TEST BUGID_TS57 TestID 
172534 DEVELOMENT_PROD BUGID_TS57 TestID 
785275 DEVELOMENT_PROD BUGID_TS57 TestID 
995932 DEVELOMENT_PROD BUGID_TS57 TestID 
640802 DEVELOMENT_PROD BUGID_TS57 TestID 
403866 DEVELOMENT_UAT BUGID_TS57 TestID 
828788 DEVELOMENT_UAT BUGID_TS57 TestID 
751490 DEVELOMENT_UAT BUGID_TS57 TestID 
972562 DEVELOMENT_UAT BUGID_TS57 TestID 
920232 DEVELOMENT_UAT BUGID_TS57 TestID 
367541 DEVELOMENT_REG BUGID_TS57 TestID 
481360 DEVELOMENT_REG BUGID_TS57 TestID 

在同一請指點。提前致謝。

+0

,我沒有得到我的鑰匙比較到另一個文件的值的概念。 – LittleMagnolia

+1

請編輯您的問題以便更清楚。代碼對你的數據沒有意義,例如我在數據中看不到任何硬編碼的'MOBILE_DEV'字符串。另外,'chomo'應該是'chomp'。 – jm666

回答

0

類似下面,其中第一個參數是文件中的一個,而第二個參數是文件中的兩個:

#!/usr/bin/perl 

use strict; 

my %hash=undef; 
open(my $fh,$ARGV[0]); 
while (<$fh>) { 
    my @fields=split(/\s+/); 
    $hash{$fields[0]}=1; 
} 
close($fh); 

open(my $fh,$ARGV[1]); 
while (<$fh>) { 
    for my $key (keys %hash) { 
     if ($key && /$key/) { 
      print "$_"; 
     } 
    } 
} 
close($fh); 
+1

我很確定'my%hash = undef'沒有達到你所想的那樣。向代碼添加'使用警告'會向您顯示問題。 –

相關問題