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

Regex 比较两个文件并按顺序打印它们之间的差异,regex,perl,compare,Regex,Perl,Compare,我有两个文件 **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 d

我有两个文件

**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;

由于数据存储为散列引用,因此不保留顺序。请参见

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

代码 我相信这符合你的标准

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

样式注释 在大多数情况下,与使用全局文件句柄相比,最好将词法文件句柄与
my
一起使用。另外,
open
的三参数形式更灵活,值得习惯。例如,我会把你的第三行写为

my $filename1 = "a.txt";
open my $file1, '<', $filename1 or die qq{Could not open "$filename1": $!\n};
my$filename1=“a.txt”;
打开我的$file1,'
测试如下:

> 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
>
$不是代码的一部分,它用于表示bash命令提示符


comm也可能对您有用。

我用此代码得到的输出是Result.txt cars bikes bus汽车亚视鹰英雄亚视bus@chinmoykhaund我不知道有什么虫子;我的代码给出了我发布的确切输出(在Ubuntu上使用Perl12.4)。列表
cars bikes bus vehicle atv hawk hero atv bus
将两个输入文件合并在一起。我无法调试您的代码而不看到它;使用警告;使用数据::转储程序;打开f1,“,我已经给出了我正在使用的代码,你能看一下吗once@chinmoykhaund啊,是的,现在我明白了。当Perl读入一行时,它返回的字符串包括换行符等。此外,您的行可能有不同数量的尾随空格。字符串
“abc”
“abc”不同“
abc\n”
。若要解决此问题,请删除每行的所有尾随空格:
my@a=map{s/\s+$/;$}
,与
@b
相同。,我需要的结果应该是,如果temp.txt中有任何不在temp2.txt中的数据,应该首先打印出来,temp2.txt中的数据和不在temp.txt中的数据应该与前面的结果一起附加。例如,输出应该是——汽车、自行车、车辆、鹰,hero@chinmoy.you说“两个文件之间的差异”。该命令打印相同的内容。只是顺序不同。输出与您提到的相同,但不是顺序。请按相同的顺序更改您的问题。
$VAR1 = [
      'cars',
      'bikes',
      'vehicle',
      'hawk',
      'hero'
    ];
my $filename1 = "a.txt";
open my $file1, '<', $filename1 or die qq{Could not open "$filename1": $!\n};
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
>
$ diff a.txt b.txt