比较两个文件

比较两个文件

请建议我们如何比较主要部分相似但混乱的两个文件。例子:

A file

72444 55555
72445 55666
55666 72446

B File

72444 55555
55666 72446
72445 55666
xxxxx yyyyy

因此,我只想获取输出文件 file 的差异以及有错误的文件的名称。如果上面的其余内容相同的话,可能会像下面这样。

B File xxxxx yyyyy

答案1

comm实用程序可以提取任一文件特有的行或两个文件共有的行。该实用程序要求对两个文件进行排序,从而解决“混乱的行”问题。

comm实用程序的默认输出位于三个制表符分隔的列中:

  1. 仅在第一个文件中找到的行。
  2. 仅在第二个文件中找到的行。
  3. 在两个文件中找到的行。

可以使用-1-2或禁用某一列-3

在这里,我使用两个进程替换来生成排序的输入数据,comm并要求它仅显示前两列,即两个文件所独有的数据。

$ comm -3 <(sort fileA) <(sort fileB)
        xxxxx yyyyy
$ comm -3 <(sort fileA) <(sort fileB) | cut -f 2-
xxxxx yyyyy

正如您所看到的,第二列是唯一包含某些内容的列,因此我们可以得出结论,该行xxxxx yyyyy仅出现在fileB并且所有其他行对于两个文件都是通用的。

如果没有,-3我们也会在第三列中看到共同点:

$ comm <(sort fileA) <(sort fileB)
                55666 72446
                72444 55555
                72445 55666
        xxxxx yyyyy

答案2

对于zsh,您可以使用其数组减法运算符:

$ a='A file' b='B file'
$ al=( ${(f)"$(<$a)"} ) bl=( ${(f)"$(<$b)"} )
$ print -rC1 -- "$a "${^al:|bl} "$b "${^bl:|al}
B file xxxxx yyyyy

在哪里:

  • $(<file)file扩展到不带尾随换行符的内容
  • ${(f)expansion}将其拆分为换行符,丢弃空元素,因此$al和分别包含和$bl的非空行。A fileB file
  • ${a:|b}扩展到数组的元素,a除了(bar)那些也在b(数组减法)中的元素。
  • text${^array}array=(a b)扩展为texta textb而不是texta b.在这里,我们使用它来将文件名作为数组减法结果元素的前缀。
  • print -rC1 -- prints列上的每个参数raw1 C

请注意,如果两个文件中同一行多次出现,即使两个文件中出现的次数不同,也不会报告该情况。

相关内容