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