我需要處理大文件,並且必須找到兩者之間的差異。我不需要不同的位數,但差異的數量。如何計算Linux上兩個文件之間的差異?
要找到不同的行我拿出
diff --suppress-common-lines --speed-large-files -y File1 File2 | wc -l
的數量和它的工作原理,但有一個更好的方式來做到這一點?
如何計算確切的差異數(使用標準工具如bash,diff,awk,sed一些舊版本的perl)?
我需要處理大文件,並且必須找到兩者之間的差異。我不需要不同的位數,但差異的數量。如何計算Linux上兩個文件之間的差異?
要找到不同的行我拿出
diff --suppress-common-lines --speed-large-files -y File1 File2 | wc -l
的數量和它的工作原理,但有一個更好的方式來做到這一點?
如何計算確切的差異數(使用標準工具如bash,diff,awk,sed一些舊版本的perl)?
diff -U 0 file1 file2 | grep -v ^@ | wc -l
對於diff
列表頂部的兩個文件名減2。統一格式可能比並排格式快一點。
如果使用的Linux/Unix,那comm -1 file1 file2
打印在文件1中沒有的文件2線,comm -1 file1 file2 | wc -l
算來,同樣爲comm -2 ...
?
正如sureshw在另一個答案中指出的那樣,'comm'預計它的參數是* sorted *文件。所以這個建議只能在特殊情況下才能使用。(我認爲使用awk編寫自己版本的'comm'也很容易,它也適用於未排序的輸入,但是懷疑這符合原始問題的精神了。) – dubiousjim
如果你想數是不同的使用該行數:
diff -U 0 file1 file2 | grep ^@ | wc -l
不約翰的回答重複計算不同的線路?
是的,它是雙重計數。看到我對接受的答案的評論。這個答案中的命令是正確的。 –
在MacOSX和Ubuntu上,這似乎也可能會對我重複計數。一批連續的行可以在一個塊中組合在一起,這取決於您的任務是否應該是一個差異或幾個。 – khedron
不要忘記彩色的輸出方式行以轉義序列開頭!必須使用hexdump來找出那一個。 –
自認爲不同於開始與<
或>
字符每個輸出線,我建議這樣的:
diff file1 file2 | grep ^[\>\<] | wc -l
通過只使用\<
或\>
的腳本行,你可以指望只在文件中的一個不同之處。
由於「<" and ">」可以打印爲同一行。 –
如果您處理的是類似內容的文件,應該對同一行進行排序(如描述類似內容的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
這是不行的,因爲我定義的「工作」的http:// pastie。 org/paste/3179433/text每個文件中只有一個字符,數字「4」與哪個字符相關? –
這做工作。對於你的例子,你有四行:前兩個是每個文件的名稱(正如答案中所解釋的),另外兩個是兩個不同之處,1行刪除'a',1行添加'b'。 –
這取決於你如何計算差異。在這個例子[pastie.org/5553254](http://pastie.org/5553254)中,我認爲有兩行不同,即我同意紅杉mcdowell。從結果中減去2也是不方便的(由於打印了2個不同的文件)。 因此,我認爲喬希的回答是正確的。通過在grep上使用-c(count)選項可以稍微縮短它,而不是像下面這樣管道到wc -l: 'diff -U 0 file1 file2 | grep -c^@' –