perl比较两个文件并打印匹配的行

时间:2011-07-28 16:04:27

标签: perl perl-module

我有这个比较2个文件的脚本并打印出diff结果。现在我想更改脚本而不是打印出diff线,我想打印匹配的行。并且还要计算每次运行脚本时匹配的时间。你能不能请任何人给我一个建议。谢谢!

#! /usr/local/bin/perl 
# compare 
my $f1 = "/opt/test.txt";
my $f2 = "/opt/test1.txt";
my $outfile = "/opt/final_result.txt";
my %results = (); 
open FILE1, "$f1" or die "Could not open file: $! \n";
while(my $line = <FILE1>){   $results{$line}=1;
}
close(FILE1); 
open FILE2, "$f2" or die "Could not open file: $! \n";
while(my $line =<FILE2>) {  
$results{$line}++;
}
close(FILE2);  
open (OUTFILE, ">$outfile") or die "Cannot open $outfile for writing \n";
foreach my $line (keys %results) { print OUTFILE $line if $results{$line} == 1;
}
close OUTFILE;

3 个答案:

答案 0 :(得分:2)

print OUTFILE $line if $results{$line} == 1;

这将打印仅出现一次的行。

print OUTFILE $line if $results{$line} > 1;

一个小的变化(==>),它现在会打印出多次出现的行。这应该打印相同的重复行。

哦,如果你想要点数,也可以这样做:

if ( $results{$line} > 1 ) {
    print OUTFILE "$results{$line}: ", $line;
}

我在这里写了一个更简洁,更灵活的版本。它需要可选的文件名并打印到STDOUT。

您可以使用0代替其中一个名称,将其中一个文件与另一个文件进行比较。使用shell重定向将其保存到文件中。

<强>用法:

$ script.pl file1.txt file2.txt > outfile.txt

代码:

use strict;
use warnings;
use autodie;

my $f1 = shift || "/opt/test.txt";
my $f2 = shift || "/opt/test1.txt";
my %results;
open my $file1, '<', $f1;
while (my $line = <$file1>) { $results{$line} = 1 }
open my $file2, '<', $f2;
while (my $line = <$file2>) { $results{$line}++ }
foreach my $line (sort { $results{$b} <=> $results{$a} } keys %results) {
    print "$results{$line}: ", $line if $results{$line} > 1;
}

答案 1 :(得分:1)

这不是最干净的做事方式......但是已经完成了艰苦的工作。颠倒逻辑以使其打印所有内容unless $results{$line} == 1if $results{$line} != 1

添加计数:

print OUTFILE "Count: $results{$line} - $line" if $results{$line} != 1;

或者,您可以使用grep过滤掉不需要的内容,完全避免if条件:

foreach my $line ( grep { $results{$_} != 1 } keys %results ) {

    print OUTFILE "Count: $results{$line} - $line";
}

答案 2 :(得分:0)

尝试测试::差异。请参阅此处查看代码示例以及输出的外观:

http://metacpan.org/pod/Test::Differences