2009-10-14 57 views
37

我需要處理大文件,並且必須找到兩者之間的差異。我不需要不同的位數,但差異的數量。如何計算Linux上兩個文件之間的差異?

要找到不同的行我拿出

diff --suppress-common-lines --speed-large-files -y File1 File2 | wc -l 

的數量和它的工作原理,但有一個更好的方式來做到這一點?

如何計算確切的差異數(使用標準工具如bash,diff,awk,sed一些舊版本的perl)?

回答

31
diff -U 0 file1 file2 | grep -v ^@ | wc -l 

對於diff列表頂部的兩個文件名減2。統一格式可能比並排格式快一點。

+5

這是不行的,因爲我定義的「工作」的http:// pastie。 org/paste/3179433/text每個文件中只有一個字符,數字「4」與哪個字符相關? –

+0

這做工作。對於你的例子,你有四行:前兩個是每個文件的名稱(正如答案中所解釋的),另外兩個是兩個不同之處,1行刪除'a',1行添加'b'。 –

+4

這取決於你如何計算差異。在這個例子[pastie.org/5553254](http://pastie.org/5553254)中,我認爲有兩行不同,即我同意紅杉mcdowell。從結果中減去2也是不方便的(由於打印了2個不同的文件)。 因此,我認爲喬希的回答是正確的。通過在grep上使用-c(count)選項可以稍微縮短它,而不是像下面這樣管道到wc -l: 'diff -U 0 file1 file2 | grep -c^@' –

6

如果使用的Linux/Unix,那comm -1 file1 file2打印在文件1中沒有的文件2線,comm -1 file1 file2 | wc -l算來,同樣爲comm -2 ...

+0

正如sureshw在另一個答案中指出的那樣,'comm'預計它的參數是* sorted *文件。所以這個建議只能在特殊情況下才能使用。(我認爲使用awk編寫自己版本的'comm'也很容易,它也適用於未排序的輸入,但是懷疑這符合原始問題的精神了。) – dubiousjim

40

如果你想數是不同的使用該行數:

diff -U 0 file1 file2 | grep ^@ | wc -l 

不約翰的回答重複計算不同的線路?

+0

是的,它是雙重計數。看到我對接受的答案的評論。這個答案中的命令是正確的。 –

+2

在MacOSX和Ubuntu上,這似乎也可能會對我重複計數。一批連續的行可以在一個塊中組合在一起,這取決於您的任務是否應該是一個差異或幾個。 – khedron

+0

不要忘記彩色的輸出方式行以轉義序列開頭!必須使用hexdump來找出那一個。 –

4

自認爲不同於開始與<>字符每個輸出線,我建議這樣的:

diff file1 file2 | grep ^[\>\<] | wc -l 

通過只使用\<\>的腳本行,你可以指望只在文件中的一個不同之處。

+0

由於「<" and ">」可以打印爲同一行。 –

0

如果您處理的是類似內容的文件,應該對同一行進行排序(如描述類似內容的CSV文件),您可能會想找到下列文件2間的區別:

File a: File b: 
min,max min,max 
1,5  2,5 
3,4  3,4 
-2,10  -1,1 

你可以實現它在Python這樣的:

different_lines = 0 
with open(file1) as a, open(file2) as b: 
    for line in a: 
     other_line = b.readline() 
     if line != other_line: 
      different_lines += 1 
相關問題