web-dev-qa-db-ja.com

Linuxの2つのファイルの違いを数えるには?

大きなファイルで作業する必要があり、2つの違いを見つける必要があります。また、異なるビットは必要ありませんが、違いの数は必要です。

私が思いつく異なる行の数を見つけるために

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

それは機能しますが、それを行うためのより良い方法はありますか?

そして、正確な違いの数を数える方法(bash、diff、awk、Perlの古いバージョンのsedなどの標準ツール)

47
Zsolt Botykai
diff -U 0 file1 file2 | grep -v ^@ | wc -l

diffリストの一番上にある2つのファイル名のマイナス2。ユニファイド形式は、おそらくサイドバイサイド形式よりも少し高速です。

42
John Kugelman

異なる行の数をカウントする場合は、これを使用します。

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

ジョンの答えは異なる行を二重に数えませんか?

45
Josh

Linux/Unixを使用している場合、comm -1 file1 file2 file2にないfile1の行を印刷するには、comm -1 file1 file2 | wc -lはそれらをカウントし、同様にcomm -2 ...

6
dubiousjim

異なる出力行はすべて<または>文字で始まるため、これをお勧めします。

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

スクリプト行で\<または\>のみを使用することにより、ファイルの1つでのみ差異をカウントできます。

5
Michal Nemec

私は正しい解決策がこれにあると信じています answer 、つまり:

$ diff -y --suppress-common-lines a b | grep '^' | wc -l
1
1
tsusanka

同じ行ごとにソートする必要のある類似のコンテンツを持つファイルを扱う場合(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
0
Daniel Lee