Perl 在一个文件中查找字符串,并将其部分附加到另一个文件中的匹配行
我有两个文件 第一: 823776473800:78:9E:EE:CA:6F;FTTH;多重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
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;