[英]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.