ファイルの差分をとる(コマンドライン版)

vimdiffなんかと同じ機能のものを作るのは難しそうだが、ファイルを行ごとに比較して一方のファイルにしか存在しない行だけを抜き出すくらいだとすぐにできそうだ。スクリプトpydiff.pyを作った。

pydiff.pyは以下の通り。

#!/bin/env python
import sys

FILE1 = sys.argv[1]
FILE2 = sys.argv[2]

L1 = open(FILE1, 'r').readlines()
L2 = open(FILE2, 'r').readlines()

for i in xrange(len(L1)):
    findFlag = 0
    for j in xrange(len(L2)):
        if L2[j] == L1[i]:
            findFlag = 1
    if not findFlag:
        print FILE1,":l",i,"> ",L1[i][:-1]

for i in xrange(len(L2)):
    findFlag = 0
    for j in xrange(len(L1)):
        if L1[j] == L2[i]:
            findFlag = 1
    if not findFlag:
        print FILE2,":l",i,"> ",L2[i][:-1]

テストデータとして、次のようなテキストデータa.txtとb.txtを使う。
a.txt

12345
abcde
ABCDE
67890

b.txt

54321
abcdf
abcde
67809

実行結果はこの通り。Windowsだと、大文字と小文字を区別しないから結果が異なる可能性はあるかもしれない。

% python pydiff.py a.txt b.txt
a.txt :l 1 >  12345
a.txt :l 3 >  ABCDE
a.txt :l 4 >  67890
b.txt :l 1 >  54321
b.txt :l 2 >  abcdf
b.txt :l 4 >  67809

このままだとWindowsで使うときに、異なるディレクトリのファイルを比較するのに面倒なのでGUI版も作る。