2개(또는 가능하면 3개 파일) "한 줄씩" 비교

2개(또는 가능하면 3개 파일) "한 줄씩" 비교

2개(또는 가능하다면 3개 파일)의 차이점을 한 줄씩 알아보고 싶습니다. Diff 유틸리티는 이를 수행할 수 있지만 결과가 부정확합니다. 왜냐하면 2개의 파일에 정확한 줄 수가 "134"이기 때문입니다. 하지만 diff에서는 "Added Lines" 및 "Removed Lines"를 제공합니다. 그러나 이것은 잘못된 것입니다. 라인 수가 정확히 동일하고 추가되거나 제거된 라인이 없습니다.

차이점을 찾고 싶은 텍스트 파일에는 숫자만 기록되어 있습니다. 아마도 이것이 해당 알고리즘이 실패하는 이유일 것입니다. 이를 방지할 수 있는 옵션을 찾을 수 없었지만 제가 틀렸을 수도 있습니다. 즉, 이에 대한 옵션이 있어야 하는데 다시 찾을 수 없었습니다.

이것이 제가 얻은 것입니다(5am.txt와 6am.txt, 큰 문제가 있습니다). http://img26.imageshack.us/img26/7049/wrongp.png

이것이 내가 원하는 것입니다(6am.txt와 7am.txt, 여전히 문제가 있음). http://img402.imageshack.us/img402/5421/semiright.png

편집하다:

이 작업을 수행할 유틸리티가 없다는 것을 파악한 후 스스로 처리했습니다. 나는 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.xdiff2html과 같이 실행하려면 다음을 수행하세요.

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++를 다시 시작한 후 두 파일을 열고(다른 탭에서 열림) 도구 모음에서 플러그인>비교>비교로 이동합니다.

여러 가지 조정 작업을 수행할 수 있지만 파일을 비교하면 다음과 같습니다.

여기에 이미지 설명을 입력하세요

흰색 텍스트는 변경되지 않고 빨간색은 제거되고 녹색은 추가되며 사이드바에는 두 파일의 변경 사항에 대한 개요가 표시됩니다.

관련 정보