请建议我们如何比较主要部分相似但混乱的两个文件。例子:
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
。
在这里,我使用两个进程替换来生成排序的输入数据,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 file
B file
${a:|b}
扩展到数组的元素,a
除了(bar)那些也在b
(数组减法)中的元素。text${^array}
当array=(a b)
扩展为texta
textb
而不是texta
b
.在这里,我们使用它来将文件名作为数组减法结果元素的前缀。print -rC1 --
print
s列上的每个参数r
aw1
C
请注意,如果两个文件中同一行多次出现,即使两个文件中出现的次数不同,也不会报告该情况。