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

时间:2013-11-06 14:51:22

标签: perl

我有两个文件

第一

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;

1 个答案:

答案 0 :(得分: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}信息。