簡體   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