比较两个文件的不同 - Shuang0420/Shuang0420.github.io GitHub Wiki

比较工具

对懒人来说,最先考虑的当然是用现有的软件功能,比如说UltraEdit的比较文件功能,比较结果如下图,红色表示不同,黑色表示相同,空白表示另一方有而这一边没有。然而这可视化效果不是很强,要求文件排序一致,如果要用的话,最好先排个序。

准备工作--统一格式

首先要保证两个文件编码一致,且换行符等符号表示一致。 我们知道,\r\n(回车换行)是 window 上的换行符,\n(换行)是 linux 上的换行符,通过UltraEdit(UE)可以将换行符统一。

  • \r\n(回车换行)转化为\n(换行),文件-->转换到-->行终结符(Unix(LF))
  • \n(换行)转化为\r\n(回车换行),文件-->转换到-->行终结符(Windows(CRLF))

求两个文件差集

grep -F -v -f small.txt large.txt > minus.txt

求两文件交集

grep -F -f a.txt b.txt > common.txt

比较两文件不同

diff命令

shell里强大的diff命令可以直接比较两个文件。diff的更多用法见参考链接。

# diff log2014.log log2013.log    
3c3 
< 2014-03 
--- 
> 2013-03 
8c8 
< 2013-07 
--- 
> 2013-08 
11,12d10 
< 2013-11 
< 2013-12
上面的“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。以”<”打头的行属于第一个文件,以”>”打头的行属于第二个文件。

这对于短小的文件或者说差异不大的文件或许ok,但对于我几十万行的文件几万行的不同就委实难以阅读了。

python+mysql

下面介绍用进行比较文件的方法,适合于量大的数据以及需要产生比较文件(增删改了多少)的场合。

数据库建表

# 在excel数据库里建立new和old两张表
USE `excel`;
CREATE TABLE `new` (
  `uq` varchar(300) CHARACTER SET utf8 DEFAULT NULL,
  `fq` varchar(550) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `old` (
  `uq` varchar(300) DEFAULT NULL,
  `fq` varchar(550) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

连接数据库

def connectDb():
    global cur,conn
    conn= MySQLdb.connect(
            host='127.0.0.1',
            port = 3306,
            user='root',
            passwd='',
            db ='excel',
            charset='utf8',
            )
    cur = conn.cursor()
    cur.execute("USE excel")

导入newfaqs,oldfaqs里的两份文件,文件格式为两列,制表符隔开。

f=open('newfaqs','r')
for line in f:
    if (len(line.split('\t'))==2):
        uq=line.split('\t')[0]
        fq=line.split('\t')[1]
        try:
            cur.execute("INSERT IGNORE INTO `old_v` VALUES ('" + uq + "','"+ fq + "')")
            conn.commit()
        except:
            conn.rollback()

f=open('oldfaqs','r')
for line in f:
    if (len(line.split('\t'))==2):
        uq=line.split('\t')[0]
        fq=line.split('\t')[1]
        try:
            cur.execute("INSERT IGNORE INTO `new` VALUES ('" + uq + "','"+ fq + "')")
            conn.commit()
        except:
            conn.rollback()
    else:
        continue

用sql语句进行比较,找出newfaqs里相对于oldfaqs删除/添加的行(包括了有改动的行)

USE excel;
SELECT * FROM old_v
  WHERE NOT EXISTS 
    (SELECT * FROM NEW
     WHERE new.uq = old_v.uq
    );

USE excel;
SELECT * FROM new
  WHERE NOT EXISTS 
    (SELECT * FROM old_v
     WHERE new.uq = old_v.uq
    );

如果有需要可以从数据库导出数据查看,可能导出csv会出现中文乱码的情况,转成gbk就好啦。

参考链接 http://www.lampweb.org/linux/3/17.html

⚠️ **GitHub.com Fallback** ⚠️