Сравнение двух файлов для одинаковых строк, где порядок не имеет значения - PullRequest
2 голосов
/ 12 ноября 2010

У меня есть два файла (которые могут иметь длину до 150 000 строк; каждая строка имеет размер 160 байт), и я хотел бы проверить, совпадают ли строки в каждом из них.diff не будет работать для меня (напрямую), потому что небольшой процент строк встречается в разных порядках в двух файлах.Как правило, пара строк будет транспонирована.
Как лучше всего увидеть, появляются ли одинаковые строки в обоих файлах, но где порядок не имеет значения?Спасибо, Крис

Ответы [ 3 ]

4 голосов
/ 12 ноября 2010

Хотя это немного дорогой способ (для чего-то большего, я бы переосмыслил это), я бы запустил Python и сделал бы следующее:

filename1 = "WHATEBVER YOUR FILENAME IS"
filename2 = "WHATEVER THE OTHER ONE IS"
file1contents = set(open(filename1).readlines())
file2contents = set(open(filename2).readlines())
if file1contents == file2contents:
    print "Yup they're the same!"
else:
    print "Nope, they differ.  In file2, not file1:\n\n"
    for diffLine in file2contents - file1contents:
        print "\t", diffLine
    print "\n\nIn file1, not file2:\n\n"
    for diffLine in file1contents - file2contents:
        print "\t", diffLine

Это напечатает разные строки, если они различаются.

1 голос
/ 12 ноября 2010

Только для 150k строк, просто хешируйте каждую строку и сохраняйте их упорядоченными в таблице поиска. Затем для каждой строки в файле два просто выполните поиск.

0 голосов
/ 12 ноября 2010

Другой скрипт на python для этого:

#!/usr/bin/env python
import sys

file1 = sys.argv[1]
file2 = sys.argv[2]

lines1 = open(file1,'r').readlines()
lines2 = open(file2,'r').readlines()
lines1.sort()
lines2.sort()

s = ''
for i,line in enumerate(lines1):
    if lines2[i] != line:
        print '> %s' % line
        print '< %s' % lines2[i]
        s = 'not'

print 'file %s is %s like file %s' % (file1, s, file2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...