2个文件之间的比较,并以顺序方式打印它们之间的差异

chi*_*und 2 regex perl compare

我有2个文件

**a.txt**
cars
bikes
bus 
vehicle
atv

**b.txt**
hawk
hero
atv
bus

***result.txt***
cars
bikes
vehicle
hawk
hero
Run Code Online (Sandbox Code Playgroud)

我想打印2个文件之间的差异.现在我尝试了一个代码,但它以随机的方式给了我差异; 我希望它以适当的顺序方式显示它.任何人都可以帮助我.

use strict;
my %results = ();  

open FILE1, "<a.txt"
    or die "Could not open file: $! \n"; 
while (my $line = <FILE1>) {

    $results{$line}=1; 
} 
close FILE1;  

open FILE2, "<b.txt" 
    or die "Could not open file: $! \n"; 
while (my $line = <FILE2>) {

    $results{$line}++; 
} 
close FILE2;

open OUTFILE, ">>result.txt" 
    or die "Cannot open $outfile for writing \n";
foreach my $line (keys %results) { 

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

close OUTFILE; 
close OUTFILE1;
Run Code Online (Sandbox Code Playgroud)

我使用此代码获得的输出是

***result.txt***
cars
hawk
bikes
hero
vehicle
Run Code Online (Sandbox Code Playgroud)

amo*_*mon 5

哈希以随机顺序存储它们的元素,因此我们必须携带位置信息.在以下解决方案中,我使用哈希值来携带唯一ID.

#!/usr/bin/perl
use strict; use warnings; use Data::Dumper;

my @a = qw( cars bikes bus vehicle atv );
my @b = qw( hawk hero atv bus );

my $i = 0;
my %ahash = map {$_ => ++$i} @a;
my %bhash = map {$_ => ++$i} @b;

my %different = map {
  ($ahash{$_} and $bhash{$_})
    ? ()
    : ($_ => ($ahash{$_} or $bhash{$_}))
} (keys %ahash, keys %bhash);

my @sorted = sort {$different{$a} <=> $different{$b}} keys %different;

print Dumper(\@sorted);
Run Code Online (Sandbox Code Playgroud)

讨论

出于演示的目的,我没有用的文件,但在存储阵列中的记录@a@b.

我使用数组元素作为键并使用唯一数字作为值来构建哈希值%ahash%bhash从这些数组中构建哈希值.在这种情况下%ahash,这些ID与行号相同.您可以将ID %bhash视为具有偏移量的行号.

然后我收集散列之间不同的所有键值对.为此,我将所有键的列表放在%ahash和中%bhash.对于这些键中的每一个,我测试两个哈希中是否存在此键(我不使用exists,而是测试该值,因为我可以保证没有分配带有false值的ID - 除了0evaluate true 之外的所有数字).如果密钥存在于两个哈希中,则返回空列表().如果密钥只存在于其中一个哈希中,我将返回一个包含密钥和值的双元素列表,该列表位于%ahash或中%bhash.

在下一步中,我按其相关值按升序对所有不同的键进行排序,并按此顺序存储键@sorted.您可以将它们打印到文件中,我只需将它们转储,然后输出:

$VAR1 = [
      'cars',
      'bikes',
      'vehicle',
      'hawk',
      'hero'
    ];
Run Code Online (Sandbox Code Playgroud)

我相信这符合您的标准.

基本上,你有一个非常优雅的算法来找到差异,但你没有包含排序数据,就像我使用我的行号一样ID.

风格笔记

在大多数情况下,使用词法文件句柄my比使用全局文件句柄更受欢迎.此外,三参数形式open更灵活,值得习惯.例如,我将你的第三行写成

my $filename1 = "a.txt";
open my $file1, '<', $filename1 or die qq{Could not open "$filename1": $!\n};
Run Code Online (Sandbox Code Playgroud)

但话说再来一次,TIM TOWTDI.