一个关于diff的用法–寻找两个文件的共同行

经常需要比较两个文件(排序好的)中序列标号(每个标号占一行)的不同, 来寻找特有的或公有的标号。以往总是自己写程序处理, 偶然一次发现了diff(采用寻找最长公共子序列的算法,详见wiki)的强大功能,便尝试使用了一下, 未得要领,只好将其函数话来实现傻瓜操作。

首先举一个简单的例子来展示diff的使用
我们有如下两个文件:

1 2
1
2
3
4
5
6
7
3
4
5
10
7
8
9

使用diff命令diff 1 2输出结果如下:

1,2d0
< 1
< 2
6c4
< 6

10
7a6,7
8
9

a表示在第一个文件中需要加入的行,d表示在第一个文件中需要除去的航,c表示第一个文件中需要被替换的行。
我们可以把diff的结果输出到一个文件作为补丁,配合patch实现文件的修补。
另外,我们可以根据以上解释得出,以>开头的行为第二个文件独有,以<号开头的行为第一个文件独有, 由此引出我们下边的脚本比较。

这里提供了一个bash脚本和一个python程序来实现这个功能,方便操作。

#!/bin/bash
 
if test $# -ne 2; then
	echo 1&gt;&amp;2 "Usage $0 first second"
	exit 1
fi
 
FIRST=$1
SECOND=$2
tmp=`date +%Y-%m-%d `
#找到只存在于第一个里面的
diff $FIRST $SECOND | grep '<' | cut -d ' ' -f 2 | sort &gt;${FIRST}.${tmp}
#找到只存在于第一个里面的
diff $FIRST ${FIRST}.${tmp} | grep '<' | cut -d ' ' -f 2 | sort &gt;${FIRST}.${SECOND}.common
/bin/rm -f ${FIRST}.${tmp}
#!/usr/bin/env python
 
import sys
 
def main():
    if len(sys.argv) != 3:
        print 'Using python %s filename1 filename2' % sys.argv[]
        sys.exit()
    alist1 = [line for line in open(sys.argv[1])]
    sys.stdout.writelines([line for line in open(sys.argv[2]) \
            if line in alist1])
 
if __name__ == '__main__':
    main()

刚才还发现了有个diff3可以同时比较三个文件。

CHENTONG
版权声明:本文为博主原创文章,转载请注明出处。
alipay.png

CHENTONG

CHENTONG
积微,月不胜日,时不胜月,岁不胜时。凡人好敖慢小事,大事至,然后兴之务之。如是,则常不胜夫敦比于小事者矣!何也?小事之至也数,其悬日也博,其为积也大。大事之至也希,其悬日也浅,其为积也小。故善日者王,善时者霸,补漏者危,大荒者亡!故,王者敬日,霸者敬时,仅存之国危而后戚之。亡国至亡而后知亡,至死而后知死,亡国之祸败,不可胜悔也。霸者之善著也,可以时托也。王者之功名,不可胜日志也。财物货宝以大为重,政教功名者反是,能积微者速成。诗曰:德如毛,民鲜能克举之。此之谓也。

R 学习

R语言是比较常用的统计分析和绘图语言,拥有强大的统计库、绘图库和生信分析的Bioconductor库,是学习生物信息分析的必备语言之一。Rstudio是编辑、运行R语言的最为理想的工具之一,支持纯R脚本、Rmarkdown (脚本文档混排)、Bookdown (脚本文档混排...… Continue reading

本地使用Rfam 12.0+

Published on June 16, 2017

Linux学习(一)- 文件和目录

Published on June 08, 2017