Perl 如何比较两个文本文件并从每个文件中输出任何缺失或额外的字符串?

Perl 如何比较两个文本文件并从每个文件中输出任何缺失或额外的字符串?,perl,compare,Perl,Compare,我有这两个示例文件来比较它们的内容。我需要比较这两个文件,并从任何文件中输出任何缺少的或额外的字符串 Ref.txt: bjkdsl dookn cmshdksldj cmshdksldj unklskdjs dookn bjkdsl New.txt: cmshdksldj unklskdjs dookn cmshdksldj unklskdjs dookn bjkdsl 输出: unklskdjs :missing string in Ref.txt bjkdsl :missi

我有这两个示例文件来比较它们的内容。我需要比较这两个文件,并从任何文件中输出任何缺少的或额外的字符串

Ref.txt:

bjkdsl
dookn
cmshdksldj
cmshdksldj
unklskdjs
dookn
bjkdsl
New.txt:

cmshdksldj
unklskdjs
dookn
cmshdksldj
unklskdjs
dookn
bjkdsl
输出:

unklskdjs :missing string in Ref.txt    
bjkdsl :missing string in New.txt
更新:示例文本文件1

Ref.txt:

bjkdsl
dookn
cmshdksldj
New.txt:

cmshdksldj
unklskdjs
dookn
bjkdsl
输出:

unklskdjs : missing string in new.txt
示例文件2:

Ref.txt:

bjkdsl
dookn
cmshdksldj
cmshdksldj
unklskdjs
dookn
bjkdsl
New.txt:

cmshdksldj
unklskdjs
dookn
cmshdksldj
unklskdjs
dookn
bjkdsl
输出:

Ref.txt is same as New.txt

感谢所有的帮助,但我仍在尝试获取每种可能发生的情况的代码

在第二个文件中找到密钥时,必须从哈希中删除该密钥。最后遍历哈希并打印所有未删除的键:

#!/usr/bin/env perl

use warnings;
use strict;

my %exclude;

open my $fh, '<', 'text2.txt' or die $!;
while (<$fh>) {
        chomp;
        $exclude{$_}++;
}

open $fh, '<', 'text1.txt' or die $!;
while (<$fh>) {
        chomp;
        if ( exists $exclude{ $_ } ) {
                delete $exclude{ $_ };
        }
        else {
                print "$_ is missing from text2\n";
        }
}

for ( keys %exclude ) {
        print "$_ is missing from text1\n";
}
这将产生:

bjkdsl is missing from text2
unklskdjs is missing from text1

当在第二个文件中找到密钥时,必须将其从哈希中删除。最后遍历哈希并打印所有未删除的键:

#!/usr/bin/env perl

use warnings;
use strict;

my %exclude;

open my $fh, '<', 'text2.txt' or die $!;
while (<$fh>) {
        chomp;
        $exclude{$_}++;
}

open $fh, '<', 'text1.txt' or die $!;
while (<$fh>) {
        chomp;
        if ( exists $exclude{ $_ } ) {
                delete $exclude{ $_ };
        }
        else {
                print "$_ is missing from text2\n";
        }
}

for ( keys %exclude ) {
        print "$_ is missing from text1\n";
}
这将产生:

bjkdsl is missing from text2
unklskdjs is missing from text1

谢谢你的快速回复。非常感谢。它确实产生了产出。但是如果文本1是bjkdsl dookn cmshdksldj,文本2是cmshdksldj bjkdsl unklskdjs dookn,它仍然打印出文本1中不应该显示的缺失行。@annel:为什么不?它存在于
file2
中,但不存在于
file1
中。但我得到了以下输出:
unklskdjs在ref中缺失在ref中缺失
感谢您的快速响应。非常感谢。它确实产生了产出。但是如果文本1是bjkdsl dookn cmshdksldj,文本2是cmshdksldj bjkdsl unklskdjs dookn,它仍然打印出文本1中不应该显示的缺失行。@annel:为什么不?它存在于
file2
中,但不存在于
file1
中。但我得到了这样的输出:
unklskdjs在ref中缺失在ref中缺失在ref中缺失
我强烈建议您对此进行评论,以解释它在做什么;对于perl新手来说,这并不明显。谢谢你的回答,但是当我比较两个文本文件中的相同内容时,我发现文本1中缺少了这个
。我该怎么处理呢?@annel你可能有一条空行。用diff检查它们,即
diff text1.txt text2.txt
谢谢。文本1.txt中确实有空行。谢谢你的帮助。我强烈建议你发表评论,解释一下它在做什么;对于perl新手来说,这并不明显。谢谢你的回答,但是当我比较两个文本文件中的相同内容时,我发现文本1中缺少了这个
。我该怎么处理呢?@annel你可能有一条空行。用diff检查它们,即
diff text1.txt text2.txt
谢谢。文本1.txt中确实有空行。谢谢你的帮助。