2014-09-21 40 views
0

我還挺停留在一個快速的腳本,我想適應,所以我想問可能會幫助我前進:)比較的2個不同的文件.tsv格式2列在一個新的TSV文件

輸出寫入我的第一穿文件是/服務器的列表主機名,看起來像這樣(groups.tsv):

Groupname | Servername 

group1  server1  
group2  server2  
group3  server3 server4 server5 
group4  server6  
group5  server7  
group6  server7 

第二個是IP地址/主機名的列表(addresses.tsv):

Hostname | IP | Purpose 

server1 192.168.1.29 255.255.255.255 application1 
server2 172.16.9.38 255.255.255.255 
server3 10.50.110.28 255.255.255.255 
server4 10.0.0.1 255.255.255.255  application2 
server5 192.168.1.1 255.255.255.255 
server6 172.16.32.32 255.255.255.255 
server7 10.0.0.3 255.255.255.255 
server8 1.1.1.1 255.255.255.255   application3 
server9 127.0.0.1 255.255.255.255  
server10 10.28.28.28 255.255.255.255 

隨着一個perl腳本找到了el sewhere我想獲得一個新的TSV文件是這樣的:

Hostname | IP | Purpose | Groupname 

server1 192.168.1.29 255.255.255.255 application1  group1 
... 

perl腳本如下:

#!/usr/bin/perl 
use strict; 
use warnings; 
my %programs; #Hash to save groupname => hostname for each program record 
open my $fh1, '<', 'groups.tsv' or die "Failed to open groups.tsv: $!"; 
foreach (<$fh1>) { 
    chomp;  #Remove newline character from end of line 
    my ($groupname, $hostname) = split(/\t/); 
    $programs{$groupname} = $hostname; 
} 
close $fh1; 
open my $fh2, '<', 'addresses.tsv' or die "Failed to open addresses.tsv: $!"; 
open my $fh3, '>', 'result.tsv' or die "Failed to open result.tsv: $!";  #Output 
foreach (<$fh2>) { 
    chomp; #Remove newline character from end of line 
    my $groupname = (split(/\t/))[1]; #Groupname 
    if (exists $programs{$groupname}) { 
     print $fh3 "$_\t$programs{$groupname}\n"; 
    } else { 
     print $fh3 "$_\t*NA*\n"; 
    } 
} 

在某些時候,我已經部分檢索組名,但是那是因爲我有困惑與反轉鍵/值。我相信我寧願檢查散列值而不是密鑰,但目前爲止我沒有成功。

現在我有這個result.tsv:

server1 192.168.1.29 255.255.255.255 application1 *NA* 
server2 172.16.9.38 255.255.255.255  *NA* 
server3 10.50.110.28 255.255.255.255 *NA* 
.... 

本着同樣的精神,我會再有一個policy.tsv

Groupname | Service 
group1 ALL 
group2 HTTP 
group3 HTTP HTTPS TCP_3389 
group3 group4 SSH 

所以我的最終目標將是有最終TSV文件是這樣的:

Hostname | IP | Purpose | Groupname | Service 

server1 192.168.1.29 255.255.255.255 application1  group1  ALL 
... 

http://www46.zippyshare.com/v/30272792/file.html

但我認爲只要第一部分確定就可能更容易適應。

任何人用Perl /哈希清除可以讓我的領先?

在此先感謝您的幫助!

+0

'我的$組名=(分割(/ \噸/))[1];'???看起來像我的IP地址... – ikegami 2014-09-21 03:27:44

回答

0

你的散列向後。你想通過主機名查找組名。改變

$programs{$groupname} = $hostname; 

$groupname{$_} = $groupname for split ' ', $hostname; 

然後底部部分成爲

my $hostname = (split /\t/)[0]; 
print $fh3 $_ . "\t" . ($groupname{$hostname} || '*NA*') . "\n";