2015-08-17 50 views
0

我有两个文件file1和file2。comapre两个文件并只打印匹配的内容

file1的内容:

 
fc1/20 20:64:00:2a:6a:7d:c8:81 
fc1/19 20:b0:00:25:b5:ff:11:02 
fc1/18 20:b0:00:25:b5:ff:11:09 
fc1/17 20:b0:00:25:b5:ff:11:0b 
fc1/16 20:b0:00:25:b5:ff:11:0d 

file2的内容:

 
20:B0:00:25:B5:FF:11:0D prd-vm32 
20:B0:00:25:B5:FF:11:0D prd-vm32 
20:B0:00:25:B5:FF:11:0B prd-vm30.bred 
20:B0:00:25:B5:FF:11:0B prd-vm30.bred 
50:06:0B:00:00:C2:62:1D PRD-VM16 
50:06:0B:00:00:C2:62:1F PRD-VM16 
50:06:0B:00:00:C3:4E:1D prd-vm07 
50:06:0B:00:00:C3:4E:1F prd-vm07 

我想应该是这样提到以下的输出:

 
fc1/16 20:B0:00:25:B5:FF:11:0D prd-vm32 
fc1/17 20:B0:00:25:B5:FF:11:0B prd-vm30.bred 

请让我知道,我怎么能实现相同。

+0

欢迎来到Stack Overflow!请编辑您的问题以准确解释您希望此计划返回的内容,因为这个问题并不完全清楚,对于理解您的问题至关重要。 – SuperBiasedMan

+0

所以你想合并基于MAC地址的线路,然后只显示已合并的不同线路?没有被合并的行没有被显示。 – Nanhydrin

+0

请查看[editing-help](http://stackoverflow.com/editing-help)。 – Cyrus

回答

0

join(1)患有排序必要性问题;将密钥存入散列可以避免这种情况(以更大的内存使用为代价)。

#!/usr/bin/env perl 
use strict; 
use warnings; 
use feature 'say'; 

my %by_mac; 

my ($file1, $file2) = @ARGV; # TODO usage notes if not set 
open my $f1, '<', $file1; # TODO error checking on open 
open my $f2, '<', $file2; # TODO error checking on open 

while (my $line = readline $f1) { 
    chomp $line; 
    my @col = split ' ', $line; 
    $by_mac{ lc $col[1] }->[0] = $col[0]; 
} 
while (my $line = readline $f2) { 
    chomp $line; 
    my @col = split ' ', $line; 
    $by_mac{ lc $col[0] }->[1] = $col[1]; 
} 

#use Data::Dumper; print Dumper \%by_mac; 

for my $key (keys %by_mac) { 
    if (grep(defined, @{ $by_mac{$key} }) == 2) { 
    say join " ", $by_mac{$key}->[0], $key, $by_mac{$key}->[1]; 
    } 
} 
0
awk 'FNR==NR{arr[toupper($2)]=$1;next} 
($1 in arr){print arr[$1],$0;delete arr[$1]}' file1 file2 

FNR:当前文件的当前记录的序号。

NR:从输入开始的当前记录的序号。

下一步:跳过行处理并继续下一行。

读取第一行时,FNR = NR。将第一列($ 1)存储到数组arr中,索引大写第二个字段($ 2)并跳至下一行。

在处理第二个文件时,循环访问数组元素。 如果第二个文件的$ 1在数组元素中,则从第二个文件中打印数组值和行。删除数组元素以跳过重复项。

+0

嗨,它的工作 – sanjay

+0

[root @ fiscsec tmp]#awk'FNR == NR {arr [toupper($ 2)] = $ 1; next}($ 1 in arr){print arr [$ 1],$ 0;删除arr [$ 1]}'file1 file2 fc1/13 20:B0:00:25:B5:FF:22:01 prd-db583031。 fc1/15 20:B0:00:25:B5:FF:11:07 prd-vm26。 fc1/16 20:B0:00:25:B5:FF:11:0D prd-vm32 fc1/16 20:B0:00:25:B5:FF:11:02 prd-vm21.brew fc1/13 20:B0:00:25:B5:FF:11:0C prd-vm31.brew – sanjay

+0

很高兴它的工作。如果有帮助,你能接受这个答案吗? –

相关问题