【发布时间】:2014-03-24 21:47:17
【问题描述】:
我希望在 Perl 中迭代一个文件,如果它找到一个特定的单词,然后存储匹配特定模式的其他行。 ldap.txt 文件在几个 Gig 中相当大。
user.txt
test1
game
ldap.txt
dn: uid=test1,ou=people,dc=admin,dc=local
blah
blah
maillocaladdress: test1@example.com
maillocaladdress: test.team@example.com
maillocaladdress: test11@example.com
some date
some more data
data
dn: uid=game,ou=people,dc=admin,dc=local
blah
blah
maillocaladdress: game@example.com
maillocaladdress: game.test@example.com
maillocaladdress: game-test@example.com
some date
some more data
data
等等……
打开 user.txt 并遍历每个用户并检查 dn: 行中 ldap.txt 上的每一行。如果匹配,则将匹配 maillocaladdress 的所有行的值存储到 varialbe ,我假设在哈希键/值 pari 中,但这里的值不止一个。
例如
test1 matches dn: uid=test1,ou=people,dc=admin,dc=local
为每个用户存储以下值。
test1@example.com
test.team@example.com
test11@example.com
代码
#! /usr/bin/perl
use strict;
use warnings;
my $ldiffile = shift;
my %emails;
open my $US, '<', 'users2.txt'
or die "Could not Open the file users2.txt: $!";
open my $FH, '<', $ldiffile
or die "Could not Open the file $ldiffile: $!";
chomp(my @users = <$US>);
#print "@users \n";
foreach my $uid (@users) {
print "$uid \n";
# while ( chomp(my $line = <$FH>) ) {
while (my $line = <$FH>) {
chomp ($line);
if ( $line =~ /dn: uid=$uid,ou=People,dc=admin,dc=local/i ) {
print "$line \n";
if ( $line =~ /mailLocalAddress: ([\w\.\-\_\@]+)/ ) {
print "<<<< $line >>>> \n";
push ( @{$emails{$uid}}, $1 );
}
}
}
}
【问题讨论】:
-
您的
user.txt文件有多大? - 没关系,我看到你已经把它加载到内存中了。 -
顺便问一下,您的实际问题是什么?什么不工作?
-
Several Gigabytes可能需要很长时间才能逐行处理。 -
交叉发布于PerlMonks。