gpt4 book ai didi

regex - Perl:比较两个文件并打印匹配和不匹配的数据

转载 作者:行者123 更新时间:2023-12-01 05:29:04 25 4
gpt4 key购买 nike

对于下面的 Perl 代码,我需要提高其效率,因为处理输入文件(包含数百万行数据)需要数小时。关于如何加快速度的任何想法?

给定两个文件,我想比较数据并打印那些匹配的行和那些不匹配的行。请注意,两列需要互换比较。

例如,

input1.txt
A B
C D

input2.txt
B A
C D
E F
G H

请注意:
第 1 行和第 2 行匹配(可互换);第 3 行和第 4 行不匹配
Output:
B A match
C D match
E F don't match
G H don't match

珀尔代码:
#!/usr/bin/perl -w
use strict;
use warnings;

open INFH1, "<input1.txt" || die "Error\n";
open INFH2, "<input2.txt" || die "Error\n";
chomp (my @array=<INFH2>);

while (<INFH1>)
{

my @values = split;
next if grep /\D/, @values or @values != 2;

my $re = qr/\A$values[0]\s+$values[1]\z|\A$values[1]\s+$values[0]\z/;

foreach my $temp (@array)
{
chomp $_;
print "$_\n" if grep $_ =~ $re, $temp;
}
}
close INFH1;
close INFH2;
1;

高度赞赏有关如何提高此代码效率的任何想法。谢谢!

最佳答案

如果您有足够的内存,请使用散列。如果符号在 input1.txt 中没有多次出现(即如果 A B 在文件中,A X 不在),以下应该起作用:

#!/usr/bin/perl
use warnings;
use strict;

my %hash;

open my $F1, '<', 'input1.txt' or die $!;
while (<$F1>) {
my @values = split / /;
@hash{@values} = reverse @values;
}
close $F1;

open my $F2, '<', 'input2.txt' or die $!;
while (<$F2>) {
my @values = split / /;
my $value = $hash{$values[0]};
if ($value and $value eq $values[1]) {
print "Matches: $_";
} else {
print "Does not match: $_";
}
}
close $F2;

更新:

对于重复的值,我会使用散列的散列。只需对符号进行排序,第一个将是大哈希中的键,第二个将是子哈希中的键:
#!/usr/bin/perl
use warnings;
use strict;

my %hash;

open my $IN1, '<', 'input1.txt' or die $!;
while (<$IN1>) {
my @values = sort split;
undef $hash{$values[0]}{$values[1]};
}
close $IN1;

open my $IN2, '<', 'input2.txt' or die $!;
while (<$IN2>) {
chomp;
my @values = sort split;
if (exists $hash{$values[0]}{$values[1]}) {
print "$_ matches\n";
} else {
print "$_ doesn't match\n";
}
}
close $IN2;

关于regex - Perl:比较两个文件并打印匹配和不匹配的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12386039/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com