我有两个文件
第一
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;
答案 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}
信息。