繁体   English   中英

如何显示两个文件之间的合并差异?

[英]How to show merged differences between two files?

我如何才能在两个文件之间仅获取区分字母?

例如,

文件1:

 aaa;bbb;ccc 123;456;789 a1a;b1b;c1c 

文件2:

 aAa;bbb;ccc 123;406;789 a1a;b1b;c5c 

在diff之后,我应该只从第二个文件中得到以下差异字符串: A05

diff -y --suppress-common-lines <(fold -w 1 file1) <(fold -w 1 file2) |
sed 's/.*\(.\)$/\1/' | paste -s -d '' -

这使用带有fold进程替换将每个文件转换成一字符宽的字符列,然后将它们与diff

-y选项打印相邻的行,而--suppress-common-lines跳过两个文件之间相同的行。 直到这里,输出看起来像这样:

$ diff -y --suppress-common-lines <(fold -w 1 file1) <(fold -w 1 file2)
a                                 | A
5                                 | 0
1                                 | 5

我们只对每行的最后一个字符感兴趣。 我们使用sed丢弃其余部分:

$ diff -y --suppress-common-lines <(fold -w 1 file1) <(fold -w 1 file2) |
> sed 's/.*\(.\)$/\1/'
A
0
5

为了使它们成一行,我们使用-s选项(序列)和空字符串作为分隔符( -d '' )进行paste 破折号告诉paste从标准输入读取。

$ diff -y --suppress-common-lines <(fold -w 1 file1) <(fold -w 1 file2) |
> sed 's/.*\(.\)$/\1/' | paste -s -d '' -
A05

如果您可以使用GNU diffutils,则可以选择使用cmp

$ cmp -lb file1 file2 | awk '{print $5}' | tr -d '\n'
A05

cmp逐字节比较文件。 -l选项(“ verbose”)使它打印所有差异,而不仅仅是第一个差异。 -b选项使它添加不同字节的ASCII解释:

$ cmp -lb file1 file2
 2 141 a    101 A
18  65 5     60 0
34  61 1     65 5

awk命令将此输出减少到第五列, tr删除换行符。

对于给出的示例,您可以逐个字符地比较文件,如果有差异,请打印第二个文件的字符。 这是一种方法:

paste <(fold -w1 file1) <(fold -w1 file2) | \
while read c1 c2; do [[ $c1 = $c2 ]] || printf $c2; done

对于给定的示例,这将打印A05

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM