发现类似文件中的不同行

时间:2015-02-10 23:54:31

标签: python bash awk

我有一个包含数万个短句的文本文件,如下所示:

go to venice
come back from grece
new york here i come
from belgium to russia and back to spain

我运行一个标记算法,该算法生成这个句子文件的标记输出:

go to <place>venice</place>
come back from <place>grece</place>
<place>new york</place> here i come
from <place>belgium</place> to <place>russia</place> and back to <place>spain</place>

算法在输入上多次运行,每次都会产生稍微不同的标记。我的目标是确定出现这些差异的那些线。换句话说,打印N个结果文件中标记不同的所有话语。

例如N = 10,我得到10个标记文件。假设所有10个标记文件的第1行都被标记为相同 - 不要打印它。假设第2行以这种方式标记并以其他方式标记9次 - 打印它。等等。

对于N = 2很容易,我只是运行diff。但如果我有N = 10个结果该怎么办?

2 个答案:

答案 0 :(得分:1)

如果您有标记的文件 - 只需为您看过多少次的每一行创建一个计数器:

# use defaultdict for convenience
from collections import defaultdict

# start counting at 0
counter_dict = defaultdict(lambda: 0)

tagged_file_names = ['tagged1.txt', 'tagged2.txt', ...]

# add all lines of each file to dict
for file_name in tagged_file_names:
    with open(file_name) as f:
        # use enumerate to maintain order
        # produces (LINE_NUMBER, LINE CONTENT) tuples (hashable)
        for line_with_number in enumerate(f.readlines()):
            counter_dict[line_with_number] += 1

# print all values that do not repeat in all files (in same location)
for key, value in counter_dict.iteritems():
    if value < len(tagged_file_names):
        print "line number %d: [%s] only repeated %d times" % (
            key[0], key[1].strip(), value
        )

<强>操作实例:

首先,我们创建一个数据结构,使我们能够计算我们的条目,这些条目是编号行。此数据结构为collections.defaultdict,其默认值为0 - 这是新添加的行数(每次添加时增加到1)。

然后,我们使用 hashable tuple创建实际条目,因此可以将其用作字典键,默认情况下深度可比对其他元组。这意味着(1, "lolz")等于(1, "lolz")但不同于(1, "not lolz")(2, lolz) - 所以它适合我们使用深度比较线来计算内容和位置。< / p>

现在剩下要做的就是使用简单的for循环添加所有条目,看看所有文件中出现了哪些键(对应于编号行)(即它们的值等于标记的数量)文件提供)。

示例:

reut@tHP-EliteBook-8470p:~/python/counter$ cat tagged1.txt 
123
abc
def
reut@tHP-EliteBook-8470p:~/python/counter$ cat tagged2.txt 
123
def
def
reut@tHP-EliteBook-8470p:~/python/counter$ ./difference_counter.py 
line number 1: [abc] only repeated 1 times
line number 1: [def] only repeated 1 times

答案 1 :(得分:0)

如果将它们全部与第一个文本进行比较,那么您可以获得所有不同文本的列表。这可能不是最快的方式,但它会起作用。

import difflib
n1 = '1 2 3 4 5 6'
n2 = '1 2 3 4 5 6'
n3 = '1 2 4 5 6 7'
l = [n1, n2, n3]
m = [x for x in l if x != l[0]]
diff = difflib.unified_diff(l[0], l.index(m))
print ''.join(diff)