Подтвердить что ты не робот

Как подсчитать различия между двумя файлами в Linux?

Мне нужно работать с большими файлами и найти различия между двумя. И мне не нужны разные биты, но количество различий.

Чтобы найти количество разных строк, я придумал

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

И это работает, но есть ли лучший способ сделать это?

И как подсчитать точное количество различий (со стандартными инструментами, такими как bash, diff, awk, sed какая-то старая версия perl)?

4b9b3361

Ответ 1

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

Это минус 2 для двух имен файлов в верхней части списка diff. Унифицированный формат, вероятно, немного быстрее, чем формат "бок о бок".

Ответ 2

Если вы хотите подсчитать количество различных строк, используйте следующее:

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

Не отвечает ли Джон двойным подсчетам разных строк?

Ответ 3

Если вы используете Linux/Unix, а что насчет comm -1 file1 file2 для печати строк в файле1, которые не находятся в файле2, comm -1 file1 file2 | wc -l для их подсчета и аналогично для comm -2 ...?

Ответ 4

Поскольку каждая выходная строка, которая отличается, начинается с символа < или >, я бы предложил следующее:

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

Используя только \< или \> в строке script, вы можете подсчитать различия только в одном из файлов.

Ответ 5

Если вы имеете дело с файлами с аналогичным контентом, которые должны быть отсортированы по одной строке для строк (например, файлы 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

Ответ 6

Я считаю, что правильное решение в этом вопросе, а именно:

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