-1

我有两个文件

第一的:

8237764738;00:78:9E:EE:CA:6F ;FTTH;MULTI
8237764738;2C:39:96:52:47:82;FTTH;MULTI
0415535921; E8:BE:81:86:F1:6F ;FTTH;MULTI
0415535921;2C:39:96:5B:12:C6;EZ;SINGLE
...等

第二:

00:78:9E:EE:CA:6F ;2013/10/28 13:37:50
E8: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;
4

1 回答 1

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}你需要的信息。

于 2013-11-06T15:44:59.830 回答