Я хочу найти различия в 2 (или 3 файлах, если возможно) построчно. Утилиты Diff могут это сделать, однако они дают неточные результаты. Потому что 2 файла имеют точное количество строк, которое равно "134". Но diff выдает мне "Добавленные строки" и "Удаленные строки". Однако это неверно, у них точно такое же количество строк, нет добавленных или удаленных строк.
Текстовые файлы, в которых я хочу найти различия, содержат только цифры, возможно, поэтому этот алгоритм не срабатывает. Я не смог найти опцию, которая бы это предотвратила, хотя я могу ошибаться, я имею в виду, что должна быть опция для этого, но, опять же, я не смог найти.
Вот что я получаю (5am.txt против 6am.txt, тут огромная проблема):
Вот что мне нужно (6am.txt против 7am.txt, все еще есть проблемы):
Редактировать:
После того, как я понял, что нет утилиты для этого, я справился сам. Я сделал почти то же самое, что сделал 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")
и назовите этот скрипт как хотите (нужноПитон 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++ откройте два файла (они откроются в разных вкладках) и на панели инструментов выберите Плагины>Сравнить>Сравнить.
Можно внести множество изменений, но сравнение файлов выглядит примерно так:
где белый текст остался без изменений, красный удален, зеленый добавлен, а на боковой панели показан обзор этих изменений в двух файлах.