2 つのファイル (可能な場合は 3 つのファイル) を「行ごとに」比較する

2 つのファイル (可能な場合は 3 つのファイル) を「行ごとに」比較する

2 つのファイル (または可能であれば 3 つのファイル) の違いを 1 行ずつ調べたいです。Diff ユーティリティでこれを行うことはできますが、結果が不正確になります。2 つのファイルの行数は正確に「134」であるためです。しかし、diff では「追加された行」と「削除された行」が表示されます。しかし、これは間違っています。行数はまったく同じで、追加された行も削除された行もありません。

違いを見つけたいテキスト ファイルには数字しか書かれていないので、おそらくそれがアルゴリズムが失敗する理由です。それを防ぐオプションは見つかりませんでしたが、間違っているかもしれません。つまり、そのためのオプションがあるはずですが、やはり見つけられませんでした。

これが私が受け取ったものです (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")

このスクリプトに好きな名前を付けてください(Python 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 は、2 番目のファイルが行の編集だけでなく、行の挿入や削除によって作成された可能性があると想定します。

挿入された行や削除された行を考慮せずに、どの行が異なるかだけを知りたい場合は、より簡単な方法を使用できます。

$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++ を再起動した後、2 つのファイルを開き (異なるタブで開きます)、ツールバーで [プラグイン] > [比較] > [比較] に移動します。

さまざまな調整が可能ですが、ファイルの比較は次のようになります。

ここに画像の説明を入力してください

白いテキストは変更されず、赤は削除され、緑が追加され、サイドバーには 2 つのファイルの変更の概要が表示されます。

関連情報