2015-08-17 68 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

很高興它的工作。如果有幫助,你能接受這個答案嗎? –

相關問題