比较2列2个不同的.tsv文件,并将输出写入新的tsv文件中

时间:2014-09-21 02:29:05

标签: perl perl-data-structures tsv

我有点困在一个我想改编的快速脚本上,所以我想问可能会帮助我继续前进:)

我的第一个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脚本,我正在尝试获取这样的新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";
    }
}

在某些时候,我已经部分检索了组名,但这是因为我把它与反转键/值混淆了。我相信我宁愿检查散列的值而不是密钥,但到目前为止我没有成功。

现在我有了这个结果.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 / hash清楚可以让我领先吗?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

你的哈希是倒退的。您想按主机名查找组名。变化

$programs{$groupname} = $hostname;

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

然后底部变为

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