如何删除与原始文件匹配的模式

时间:2016-10-10 04:47:20

标签: perl

如何从原始文件中删除我在输出文件中打印的匹配模式。我用下面的脚本打印出所有匹配到FILE6的文件

open FILE4,'<RM' or die $!;
open FILE5,'<OR' or die $!;
open FILE6, '>Compare3.txt' or die $!;

my @array3 = <FILE4>;
my @array4 = <FILE5>;

foreach $x (@array3) {
    if($x =~ /(\S+) (\d+) (\S+)/) {
        $temp_allreg = $3; 
        foreach $y (@array4) {
            if($y =~ /\b$temp_allreg\b/i) {
                print FILE6 "$x$y\n";
            }
        }
    }
}

基于上述编码,我将匹配的数据从2个文件打印到输出文件FILE6。那么如何修改此代码以从原始文件FILE4和FILE5中删除在FILE 6中打印出的匹配模式。因此FILE4和FILE5只保留不匹配的模式/数据。

2 个答案:

答案 0 :(得分:0)

在同一个循环中进行吗?

use File::Slurp qw(read_file write_file);
my $data = read_file $filename, {binmode => ':utf8'};

foreach $x (@array3) {
    if($x =~ /(\S+) (\d+) (\S+)/) {
        $temp_allreg = $3; 
        foreach $y (@array4) {
            if($y =~ /\b$temp_allreg\b/i){
                #print to output file
                print FILE6 "$x$y\n";
                #remove from input file
                $data =~ s/$x$y//g;
                write_file $filename, {binmode => ':utf8'}, $data;
            }
        }
    }
}

由于你不能使用File::Slurp模块,你可以考虑自己编写这些子程序。

sub read_file {
    my ($filename) = @_;

    open my $in, '<:encoding(UTF-8)', $filename or die "Could not open '$filename' for reading $!";
    local $/ = undef;
    my $all = <$in>;
    close $in;

    return $all;
}

sub write_file {
    my ($filename, $content) = @_;

    open my $out, '>:encoding(UTF-8)', $filename or die "Could not open '$filename' for writing $!";;
    print $out $content;
    close $out;

    return;
}

请参阅:How to replace a string in a file [perlmaven]

答案 1 :(得分:0)

use strict;
use warnings;

my $rm_qfn  = 'RM';
my $or_qfn  = 'OR';
my $out_qfn = 'Compare3.txt';

open(my $rm_fh, '<', $rm_qfn)
    or die("Can't open \"$rm_qfn\": $!\n");
open(my $or_fh, '<', $or_qfn)
    or die("Can't open \"$or_qfn\": $!\n");

open(my $out_fh, '>', $out_qfn)
    or die("Can't create \"$out_qfn\": $!\n");
open(my $out_rm_fh, '>', "$rm_qfn.tmp")
    or die("Can't create \"$rm_qfn.tmp\": $!\n");
open(my $out_or_fh, '>', "$or_qfn.tmp")
    or die("Can't create \"$or_qfn.tmp\": $!\n");

chomp( my @ors = <$or_fh> );

my @matched_ors;
while (my $rm = <$rm_fh>) {
    chomp($rm);
    my $matched_rm = 0;

    if (my ($all_reg) = $rm =~ /\S+ \d+ (\S+)/) {
        for my $or_idx (0..$#ors) {
            my $or = $ors[$or_idx];
            if ($or =~ /\b\Q$all_reg\E\b/i) {
                ++$matched_rm;
                ++$matched_ors[$or_idx];
                print($out_fh "$rm$or\n");
            }
        }
    }

    if (!$matched_rm) {
        print($out_rm_fh "$rm\n");
    }
}

close($rm_fh);
close($or_fh);

for my $or_idx (0..$#ors) {
    if (!$matched_ors[$or_idx]) {
        my $or = $ors[$or_idx];
        print($out_or_fh "$or\n");
    }
}

close($out_rm_fh);
close($out_or_fh);

rename("$rm_qfn.tmp", $rm_qfn)
   or die("Can't rename \"$rm_qfn.tmp\" to \"$rm_qfn\": $!\n");
rename("$or_qfn.tmp", $or_qfn)
   or die("Can't rename \"$or_qfn.tmp\" to \"$or_qfn\": $!\n");