差异文件头

差异文件头

我有两个文件。我怀疑一个文件是另一个文件的子集。有没有一种方法可以比较文件以识别(以简洁的方式)第二个文件在第一个文件中的位置?

答案1

diff -e bigger smaller 可以解决问题,但需要一些解释,因为输出是“有效的编辑脚本”。

我制作了两个文件,“bigger”和“smaller”,其中“smaller”的内容与“bigger”的第5行到第9行相同,执行“diff -e更大更小”得到了我:

% diff -e bigger smaller
10,15d
1,4d

这意味着“删除'更大'的第10行到第15行,然后删除第1行到第4行,以获得'更小'”。这意味着“较小”是“较大”的第 5 行到第 9 行。

反转文件名让我的事情变得更复杂。如果“smaller”确实构成“bigger”的子集,则输出中只会显示“d”(用于删除)命令。

答案2

您可以通过以下方式直观地完成此操作融合。不幸的是,它是一个 GUI 工具,但如果您只想在一个相对较小的文件上执行一次,那么应该没问题:

下图是 的输出meld a b

在此输入图像描述

答案3

如果文件足够小,您可以将它们都放入 Perl 中并让其正则表达式引擎完成任务:

perl -0777e '
        open "$FILE1","<","file_1";
        open "$FILE2","<","file_2";
        $file_1 = <$FILE1>;
        $file_2 = <$FILE2>;
        print "file_2 is", $file_1 =~ /\Q$file_2\E/ ? "" : "not";
        print " a subset of file_1\n";
'

-0777开关指示 Perl 将其输入记录分隔符设置$/为未定义的值,以便完全读取文件。

答案4

您的问题是“差异文件头”。如果您确实意味着一个文件是另一个文件的头,那么一个简单的方法cmp会告诉您:

cmp big_file small_file
cmp: EOF on small_file

这告诉您,直到读取时到达文件末尾才检测到两个文件之间的差异small_file

但是,如果您的意思是小文件的整个文本可以出现在内部的任何位置big_file,那么假设您可以将这两个文件放入内存中,您可以使用

perl -le '
   use autodie;
   undef $/;
   open SMALL, "<", "small_file";
   open BIG, "<", "big_file";
   $small = <SMALL>;
   $big = <BIG>;
   $pos = index $big, $small;
   print $pos if $pos >= 0;
'

big_file这将打印的内容所在位置的偏移量(例如,如果在 的开头匹配,small_file则为 0 )。如果内部不匹配,则不会打印任何内容。如果出现错误,退出状态将为非零。small_filebig_filesmall_filebig_file

相关内容