文本文件的交集

4 投票
3 回答
1207 浏览
提问于 2025-04-16 20:18

我想知道怎么能找出两个文本文件之间的共同内容,具体来说就是找出它们之间相同的字符。无论是用命令行还是用Python、Elisp或其他常见的脚本语言都可以。

我知道有一些命令,比如 commgrep -Fxv -f file1 file2,这些命令都是用来比较文件的行,但我想要的是比较字符,也就是说,我想找出两个文件中相同的字符,并且要有一个最小的匹配长度。

如果能做到这一点又快又好,那就更棒了。

举个例子

假设文件1的内容是

foo bar baz-fee

而文件2的内容是

fee foo bar-faa

那么我希望能看到的结果是

  • foo bar
  • fee

这里假设我们设定的最小匹配长度是3。

3 个回答

0

你可以试着调整一下diff的选项,具体可以看看这个链接:http://ss64.com/bash/diff.html

不过我还是不太明白你具体在问什么。你所说的“词”是指什么呢?还有,这里提到的交集过程是怎么定义的呢?

2

好的,这里有一个非常简单的 Python 脚本来完成这个任务。

虽然这个脚本可以进一步改进,但基本上可以完成工作。

temp.txt

xx yy xyz zz aa
xx yy xyz zz aa
xx yy xyz zz aa
xx yy 111 aa cc

temp2.txt

yy aa cc dd
ff xx ee 11
oo mm aa tt

common.py

#!/usr/bin/python
import sys

def main():
    f1,f2 = tryOpen(sys.argv[1],sys.argv[2])
    commonWords(f1,f2)
    f1.close()
    f2.close()

def tryOpen(fn1,fn2):
    try:
      f1 = open(fn1, 'r')
      f2 = open(fn2, 'r')
      return f1,f2
    except Exception as e:
      print('Oh No! => %s' %e)
      sys.exit(2) #Unix programs generally use 2 for 
                  #command line syntax errors
                  # and 1 for all other kind of errors.

def commonWords(f1,f2):

    words = []
    for line in f1:
      for word in line.strip().split():
            words.append(word)
    for line in f2:
        for word in line.strip().split():
            if word in words: print 'common word found => %s' % word    
if __name__ == '__main__':
    main()

输出结果

./common.py temp.txt temp2.txt
common word found => yy
common word found => aa
common word found => cc
common word found => xx
common word found => aa
8

你在找Python的difflib模块(这是标准库的一部分),特别是里面的difflib.SequenceMatcher这个东西。

撰写回答