2013-11-06 1 views
-1

У меня есть два файлаНайти строку в один файл и добавить его часть на соответствующую строку в другой файл

первый:

8237764738; 00: 78: 9E: EE: CA: 6F; FTTH; MULTI
8237764738; 2C: 39: 96: 52: 47: 82; FTTH; MULTI
0415535921; Е8: BE: 81: 86: F1: 6F; FTTH; МУЛЬТИ
0415535921; 2C: 39: 96: 5B: 12: С6; EZ; ОДНОГО
... и т.д.

второй:

00: 78: 9E: EE: CA: 6F; 2013/10/28 13:37:50
Е8: BE: 81: 86: F1: 6F; 2013/11/05 13:38 : 30
00: 78: 9E: EC: 4A: B0; 2013/10/28 13:59:16
2C: E4: 12: AA: F7: 95; 2013/10/31 13:57:55
... и т.д.

, и я должен взять mac_address (вторая позиция) из первого файла и найти его во втором и добавить (если матч) к первому файлу дату в конце из второго файла.

выход:

8237764738;00:78:9E:EE:CA:6F;FTTH;MULTI;2013/10/28 13:37:50 
0415535921;E8:BE:81:86:F1:6F;FTTH;MULTI;2013/11/05 13:38:30 

написать простой скрипт, чтобы найти mac_address , но я не знаю, как поставить в сценарий, чтобы добавить дату.

my %iptv; 
    my @result; 
    open IN, "/home/terminals.csv"; 
    while (<IN>) { 
     chomp; 
     @wynik = split(/;/,$_); 
     $iptv{$result[1]} = $result[0]; 
     } 
    close IN; 

    open IN, "/home/reboots.csv"; 
    open OUT, ">/home/out.csv"; 
    while (<IN>) { 
     chomp; 
     my ($mac, $date) = split(/;/,$_); 
     if (defined $iptv{$mac}) 
     { 
     print OUT "$date,$mac \n"; 
     } 
    } 
    close IN; 
    close OUT; 
+2

Я читал ваше описание пару раз, и я не могу понять это. Я понимаю, что в обоих файлах есть адреса mac, и они совпадают. Вы просто хотите добавить данные из первого файла во второе соответствие по адресу mac?Или первое поле в первом файле представляет собой какую-то кодированную дату? – Vorsprung

+0

Можете ли вы показать пример того, каким должен быть конечный результат? – Cfreak

+0

Насколько велики эти два файла? Просто мегабайты (или меньше), или гигабайты, или что? Являются ли номера MAC в первом файле уникальными или один и тот же номер MAC появляется дважды? Предполагая, что заданный номер MAC появляется более одного раза во втором файле (они, кажется, время перезагрузки, и машины могут быть перезагружены много раз), какое значение должно быть напечатано с данными из первого? Один раз для каждого матча, или только первый, или только последний или какой-либо другой критерий? –

ответ

0

Если предположить, что первый файл содержит список каждый номер MAC один раз, и что вы хотите выходную линию каждый раз, когда MAC появляется во втором файле, то:

#!/usr/bin/env perl 
use strict; 
use warnings; 

die "Usage: $0 terminals reboots\n" unless scalar(@ARGV) == 2; 

my %iptv; 
open my $in1, '<', $ARGV[0] or die "Failed to open file $ARGV[0] for reading"; 
while (<$in1>) 
{ 
    chomp; 
    my @result = split(/;/, $_);  # Fix array used here 
    $iptv{$result[1]} = $_;   # Fix what's stored here 
} 
close $in1; 

open my $in2, '<', $ARGV[1] or die "Failed to open file $ARGV[1] for reading"; 
while (<$in2>) 
{ 
    chomp; 
    my ($mac, $date) = split(/;/,$_); 
    print "$iptv{$mac};$date\n" if (defined $iptv{$mac}); 
} 
close $in2; 

Это использует два имени файла на командной строки и записывается на стандартный вывод; это более общая программа, чем ваш оригинал. Это также приводит меня к проблеме, что у меня нет каталога /home.

Для ваших входов образцов, выход:

8237764738;00:78:9E:EE:CA:6F;FTTH;MULTI;2013/10/28 13:37:50 
0415535921;E8:BE:81:86:F1:6F;FTTH;MULTI;2013/11/05 13:38:30 

Вы на самом деле были довольно близки к этому, но делали какие-то глупые маленькие ошибки. В коде, вы либо не показывать все или вы не используете:

use strict; 
use warnings; 
эксперты

Perl использовать оба, чтобы убедиться, что они не делают глупые ошибки; новички тоже должны это делать. Было бы указано, что @wynik не был объявлен с my и был назначен, но не использован, например. Вы могли бы написать @result = split...;. Вы не сохранили правильные данные; вы не записывали информацию из $iptv{$mac}, которая вам нужна.

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