「逐行」比較 2 個(或 3 個文件,如果可能)

「逐行」比較 2 個(或 3 個文件,如果可能)

我想逐行找出 2 個(或 3 個文件,如果可能的話)的差異。 Diff utils 可以做到這一點,但它給出的結果不準確。因為,2 個檔案的確切行數為「134」。但 diff 給了我「新增的行」和「刪除的行」。然而這是錯誤的,它們具有完全相同的行數,沒有添加或刪除行。

我想找到它們之間的差異的文本文件只寫了數字,也許這就是演算法失敗的原因。我找不到任何選項來阻止這種情況,但是我可能是錯的,我的意思是應該有一個選項,但同樣,我找不到。

這就是我得到的結果(5am.txt 與 6am.txt,有一個很大的問題): http://img26.imageshack.us/img26/7049/wrongp.png

這就是我想要的(6am.txt 與 7am.txt,仍然有問題): http://img402.imageshack.us/img402/5421/semiright.png

編輯:

當我發現這樣做沒有任何用處後,我就自己處理了。我幾乎做了和 RedGrittyBrick 所做的一樣的事情。該腳本模仿 diff 實用程序,因此我(或您)可以將它與 diff2html 一起使用。

要將其與 diff2html 一起使用,只需更改行

diff_stdout = os.popen("diff %s" % string.join(argv[1:]), "r")

diff_stdout = os.popen("script.py %s" % string.join(argv[1:]), "r")

並將此腳本命名為您想要的任何名稱(需要Python 2.x執行,如 diff2html):

import sys

f1=open(sys.argv[1],"r")
f1_read=f1.readlines()
f1.close()
f2=open(sys.argv[2],"r")
f2_read=f2.readlines()
f2.close()

changed={}
first_c = ""
for n in range(len(f1_read)):
    if f1_read[n]!=f2_read[n]:
        if first_c == "":
            first_c=n+1
        changed[first_c]=n+1
    else:
        first_c=""

#Let's imitate diff-utils...

for (x, y) in changed.items():
    print "%d,%dc%d,%d" % (x,y,x,y)
    for i in range(x,y+1):
        sys.stdout.write("< %s" % f1_read[i-1])
    print "---"
    for i in range(x,y+1):
        sys.stdout.write("> %s" % f2_read[i-1])

最終結果: 在此輸入影像描述

答案1

diff 假定第二個檔案可能不僅是透過編輯行建立的,而且是透過插入和刪除行建立的。

如果您只想知道哪些行不同而不考慮插入或刪除的行,則可以使用更簡單的方法。

$perl d.pl a b | less
  1:   255,   107 DIFFERENT!
  2:   197,   148 DIFFERENT!
  3:   113,   165 DIFFERENT!
  4:     0,   221 DIFFERENT!
  5:     0,   153 DIFFERENT!
  6:     0,    85 DIFFERENT!
  7:    48,   255 DIFFERENT!
  8:    61,   187 DIFFERENT!
  9:    63,    85 DIFFERENT!
 10:     3,     0 DIFFERENT!
 11:    49,     0 DIFFERENT!
 12:    58,    15 DIFFERENT!
 13:    47,     0 DIFFERENT!
 14:    62,     0 DIFFERENT!
 15:    61,     0 DIFFERENT!
 16:   255,   255 same
 17:   255,   255 same
 18:   255,   255 same
 19:   255,   255 same
 20:   255,   255 same
 21:   255,   255 same

其中 d.pl 是

#!/usr/bin/perl
use strict;
use warnings;

open my $f1, '<', $ARGV[0] or die "Can't read '$ARGV[0]' - $!\n";
open my $f2, '<', $ARGV[1] or die "Can't read '$ARGV[1]' - $!\n";

while (my $f1_line = <$f1>) {
  my $f2_line = <$f2>;
  chomp for $f1_line, $f2_line;
  my $verdict = $f1_line eq $f2_line ? 'same' : "DIFFERENT!";
  printf "%3d: %5d, %5d %s\n", $., $f1_line, $f2_line, $verdict;
}

close $f2;
close $f1;

答案2

要並排比較文件,我最喜歡的工具是記事本++

安裝後,在工具列上按一下“外掛程式”>“外掛程式管理器”>“可用”,然後選取“比較並安裝”。

重新啟動 Notepad++ 後,打開這兩個檔案(它們將在不同的標籤中開啟),然後在工具列中轉到「插件」>「比較」>「比較」。

您可以進行多種調整,但比較文件看起來像這樣:

在此輸入影像描述

其中白色文字未更改,紅色被刪除,綠色被添加,側邊欄顯示兩個檔案中這些更改的概述。

相關內容