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

Добро пожаловать в переполнение стека! Измените свой вопрос, чтобы точно объяснить, что вы хотите вернуть этой программе, поскольку это не совсем ясно из вопроса, и это важно для понимания вашей проблемы. – SuperBiasedMan

+0

Итак, вы хотите объединить строки на основе MAC-адреса, а затем показывать только отдельные линии, которые были объединены? Линии, которые не были объединены, не показаны. – Nanhydrin

+0

Обратите внимание на [edit-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; delete 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

Рад, что он сработал. Можете ли вы принять этот ответ, если это поможет? –

Смежные вопросы