两个文件之间的比较,并按顺序打印它们之间的差异



我有两个文件,即

**a.txt**
cars
bikes
bus 
vehicle
atv
**b.txt**
hawk
hero
atv
bus
***result.txt***
cars
bikes
vehicle
hawk
hero

我想打印这两个文件之间的差异。现在我尝试了一个代码,但它以随机的方式给了我不同;我希望它以适当的顺序方式显示它。有人能帮我吗。

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;

我用这个代码得到的输出是

***result.txt***
cars
hawk
bikes
hero
vehicle

哈希以随机顺序存储其元素,因此我们必须随身携带位置信息。在以下解决方案中,我使用哈希值来携带唯一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);

讨论

出于演示的目的,我没有使用文件,而是将记录存储在数组@a@b中。

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

然后,我收集散列之间不同的所有键值对。为此,我获取了%ahash%bhash中所有密钥的列表。对于这些键中的每一个,我都会在两个散列中测试该键的存在性(我不使用exists,而是根据值进行测试,因为我可以保证没有分配任何具有false值的ID——除了0之外的所有数字都评估为true)。如果两个散列中都存在密钥,则返回空列表()。如果键只存在于其中一个散列中,我将返回一个包含键和值的双元素列表,该列表位于%ahash%bhash中。

在下一步中,我按照关联值按升序对所有不同的键进行排序,并将这些键按此顺序存储在@sorted中。你可以将它们打印到一个文件中,我只是简单地将它们转储,然后得到以下输出:

$VAR1 = [
'cars',
'bikes',
'vehicle',
'hawk',
'hero'
];

我相信这符合你的标准。

基本上,您有一个非常优雅的算法来查找差异,但您没有像我对ID这样的行号所做的那样合并排序数据。

样式注释

在大多数情况下,使用带有my的词法文件句柄比使用全局文件句柄更可取。此外,open的三元形式更灵活,值得习惯

my $filename1 = "a.txt";
open my $file1, '<', $filename1 or die qq{Could not open "$filename1": $!n};

但话说回来,TIM TOWTDI。

perl -lne '$X{$_}++;if(eof){$a++;}if($a==2){foreach (keys %X){if($X{$_}==1){print $_}}}' file1 file2

测试如下:

> cat temp
cars
bikes
bus
vehicle
atv
> cat temp2
hawk
hero
atv
bus
> perl -lne '$X{$_}++;if(eof){$a++;}if($a==2){foreach (keys %X){if($X{$_}==1){print $_}}}' temp temp2
cars
hawk
hero
vehicle
bikes
>

由于数据存储为哈希引用,因此不保留顺序。请参阅如何按特定顺序打印Perl哈希?

$ diff a.txt b.txt

$不是代码的一部分,它用于表示bash命令提示符。

comm也可能对你有用。

相关内容

  • 没有找到相关文章

最新更新