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