加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:13:07 所属栏目:大数据 来源:网络整理
导读:对于下面的Perl代码,我需要提高效率,因为处理输入文件(包含数百万行数据)需要数小时.关于如何加快速度的任何想法? 给定两个文件,我想比较数据并打印那些匹配的行和那些不匹配的行.请注意,需要交替比较两列. 例如, input1.txtA BC Dinput2.txtB AC DE FG H
对于下面的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

Perl代码:

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

open INFH1,"<input1.txt" || die "Errorn";
open INFH2,"<input2.txt" || die "Errorn";
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 "$_ matchesn";
    } else {
        print "$_ doesn't matchn";
    }
}
close $IN2;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读