Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 在一个文件中查找字符串,并将其部分附加到另一个文件中的匹配行_Perl - Fatal编程技术网

Perl 在一个文件中查找字符串,并将其部分附加到另一个文件中的匹配行

Perl 在一个文件中查找字符串,并将其部分附加到另一个文件中的匹配行,perl,Perl,我有两个文件 第一: 823776473800:78:9E:EE:CA:6F;FTTH;多重 8237764738;2C:39:96:52:47:82;FTTH;多重 0415535921;E8:BE:81:86:F1:6F;FTTH;多重 0415535921;2C:39:96:5B:12:C6;简单单个 …等等 第二: 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

我有两个文件

第一:

823776473800:78:9E:EE:CA:6F;FTTH;多重
8237764738;2C:39:96:52:47:82;FTTH;多重
0415535921;E8:BE:81:86:F1:6F;FTTH;多重
0415535921;2C:39:96:5B:12:C6;简单单个
…等等

第二:

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_地址(第二个位置),然后在第二个文件中找到它 并将第二个文件末尾的日期(如果匹配)附加到第一个文件

输出:

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_地址 但我不知道如何在脚本中添加日期

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;
my%iptv;
我的结果;
在“/home/terminals.csv”中打开;
而(){
咀嚼;
@wynik=拆分(/;/,$);
$iptv{$result[1]}=$result[0];
}
接近;
在“/home/reboots.csv”中打开;
打开“>/home/OUT.csv”;
而(){
咀嚼;
my($mac,$date)=拆分(/;/,$);
if(定义为$iptv{$mac})
{
打印出“$date$mac\n”;
}
}
接近;
收尾;

假设第一个文件列出了每个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;
事实上,你离这很近,但犯了一些愚蠢的小错误。 在代码中,要么没有显示所有内容,要么没有使用:

use strict;
use warnings;

Perl专家使用这两种方法来确保他们不会犯愚蠢的错误;初学者也应该这样做。它会指出,例如,
@wynik
不是用
my
声明的,而是分配给但没有使用的。你本可以写
@result=split。您没有保存正确的数据;你没有从
$iptv{$mac}
中写出你需要的信息。

我已经读了你的描述好几次了,我不太明白。我知道这两个文件中都有mac地址,并且这些地址是匹配的。您只是想将第一个文件中的数据添加到第二个匹配的mac地址吗??或者第一个文件中的第一个字段是某种编码的日期吗?您能给出最终输出的示例吗?这两个文件有多大?仅仅是兆字节(或更小),或者千兆字节,或者什么?第一个文件中的MAC号是唯一的,还是同一个MAC号会出现两次?假设给定的MAC编号在第二个文件中出现多次(它们似乎是重新启动的次数,并且机器可以多次重新启动),那么应该使用第一个文件中的数据打印哪个值?每场比赛一次,或者只是第一次,或者只是最后一次,或者其他标准?
use strict;
use warnings;