读书人

运用perl实现多个文件合并

发布时间: 2013-01-21 10:15:39 作者: rapoo

使用perl实现多个文件合并
请教一下, 我现在要使用perl实现多个文件合并, 哪位高手能指点一下, 大体是这样的:
比如a 文件 内容如下
a=11 b=http://www.baidu.com/1q2.XXXXX/XXX c=http://www.baidu.com/msoft/sec/tmp/baidu.apk

a=12 b=http://www.sina.com
/xxdxx/dsfds c=http://www.sina.com/msoft/sec/tmp/sina.apk

a=13 b=http://www.qq.com/sdfsdfsdf/sdfsdfs c=http://www.qq.com/qq.akc

b 文件内容如下
http://www.baidu.com/*,111
http://www.sina.com/*,112
c 文件内容如下
www.baidu.com,baidu.apk,123
www.sina.com,sina.apk,12223
结果
11,http://www.baidu.com/1q2.XXXXX/XXX,http://www.baidu.com/msoft/sec/tmp/baidu.apk,111,12312,http://www.sina.com//xxdxx/dsfds,http://www.sina.com/msoft/sec/tmp/sina.apk,112,1222313,http://www.qq.com/sdfsdfsdf/sdfsdfs,http://www.qq.com/msoft/sec/tmp/baidu.apk,,
希望有高手留下代码 ,在下感激不尽。 perl
[解决办法]

#!/usr/bin/perl

my %bhash;
my %chash;

sub read_file_to_hash {
my ($name, $hash, $pat) = @_;
open my $fd, '<', $name or die $!;
while (<$fd>) {
chomp;
my ($x, $y, $z) = split /$pat/;
if ($z) {
$hash->{$y} = $z;
}
else {
$hash->{$x} = $y;
}
}
close $fd;
}

read_file_to_hash('b.txt', \%bhash, '\*,');
read_file_to_hash('c.txt', \%chash, ',');

sub do_process {
my $str = shift @_;
my ($x, $y, $z) = $str =~ /=(\S+)/g;
my ($url, $apk) = ($y, $z);
$url =~ s
[解决办法]
(http://.*?/).*
[解决办法]
$1
[解决办法]
;
$apk =~ s
[解决办法]
.*/
[解决办法]
;
print join(',', ($x, $y, $z), $bhash{$url}, $chash{$apk}), "\n";
}

open $rfd, '<', 'a.txt' or die $!;
my $lines;
while (<$rfd>) {
chomp;
s/^\s+//g;
if (not /^$/) {
$lines .= $_;
next;
}
do_process($lines);
$lines = '';
}
if ($lines =~ /^.+$/) {
do_process($lines);
}
close $rfd;

输出:
11,http://www.baidu.com/1q2.XXXXX/XXX,http://www.baidu.com/msoft/sec/tmp/baidu.apk,111,123 


12,http://www.sina.com/xxdxx/dsfds,http://www.sina.com/msoft/sec/tmp/sina.apk,112,12223
13,http://www.qq.com/sdfsdfsdf/sdfsdfs,http://www.qq.com/qq.ak,,


[解决办法]
#!/usr/bin/perl

my %bhash;
my %chash;

sub do_process {
my $str = shift @_;
my ($x, $y, $z) = $str =~ /=(\S+)/g;
my ($url, $apk) = ($y, $z);
$url =~ s
[解决办法]
http://(.*?)/.*
[解决办法]
$1
[解决办法]
;
$apk =~ s
[解决办法]
.*/
[解决办法]
;
print join(',', ($x, $y, $z), $bhash{$url}, $chash{$apk}), "\n";
}

open my $fd, '<', 'b.txt' or die $!;
while (<$fd>) {
chomp;
my ($x, $y) = split /,/;
$x =~ s
[解决办法]
http://(.*?)/.*
[解决办法]
$1
[解决办法]
;
$bhash{$x} = $y;
}
close $fd;

open my $fd, '<', 'c.txt' or die $!;
while (<$fd>) {
chomp;
my ($x, $y, $z) = split /,/;
$chash{$y} = $z;
}
close $fd;

open my $fd, '<', 'a.txt' or die $!;
my $lines;
while (<$fd>) {
s/^\s+//g;
s/\s+$//g;
if (not /^$/) {
$lines .= $_;
next;
}
do_process($lines);
$lines = '';
}
if ($lines =~ /^.+$/) {
do_process($lines);
}
close $fd;

读书人网 >perl python

热点推荐