最近公司有一大堆的代号需要比较,已经分成了两个文件,求A-B的补集。shell命令可以用comm, diff, sort 甚至grep的参数。
精通这些命令需要很长的时间,而且感觉走了弯路。
比如说,使用sort命令,会自动对文件的行排序,所以结果也多了一个步骤,“排序”,再比如grep,是对文件中的一行匹配,如果遇到针对一行中的某个字段,则要放弃grep了,因为grep只是对行操作。
但是现在使用python,再加上一点点的算法则,则“一切都在掌握之中”。例如:
1 #!/usr/bin/env python
2 #read lines from mids.txt
3 importsys4
5 f1, f2=None,None6 try:7 f1=open("mids.txt", "r")8 m=f1.readlines()9 exceptIOError:10 print "mids.txt does not exist!"
11 sys.exit(2)12 finally:13 iff1:14 f1.close()15 #reead lines from mids2.txt
16 try:17 f2=open("mids2.txt", "r")18 n=f2.readlines()19 exceptIOError:20 print "mids2.txt does not exist!"
21 sys.exit(2)22 finally:23 iff2:24 f2.close()25 #filter
26 for a inm:27 for b inn:28 if a==b:29 n.remove(b)30
31 for i inrange(len(n)):32 n[i]=n[i].strip()33
34 print " ".join(n)
readlines会读取每行的内容(包括回车符 '\n'),然后把每一行的内容作为元素存入指定的列表中,虽然后面跟着回车符,但是不影响比较,所以就没有去掉,知道最后得到结果的时候才去掉回车符,然后把列表合并成一整块字符串。
其实这是最简单的比较,如果需要求一行中某个特殊的字段,则需要re正则表达式模块。
python用于运算结构简单,迅速,在有些方面是胜于shell脚本的。这里没有用到任何linux命令,但是完成linux命令组合才能做到的事情是这篇文章的亮点。而且随着要求的复杂,python的优势就会体现出来。
第二个例子:
两个文件:
log
516689024,516687533,516690910,516687940,516687510,516688203,517291285,516688195,516708331
log2
516706050 516708202 516706926 516688819 516708265 516687887 516686936
516687791 516690999 516689665 516687686 516689915 516690790 516687027
516691061 516689157 517290929 517292136 516688571 516687746 516689789
517291799 516687545 517291060 516688211 516707087 516687870 517290886
516705798 516691043 516705690 516688109 516688547 516687596 516688927
516687994 516687476 516687892 516688731 516687314 516689902 516687350
516688822 516689164 516688195 516687798 516687690 516687510 516687824
516688789 516686991 516687940 516691092 516687533 516689024 517291285
516690910 516708405 516687615 516689438 516688203 516708331
两个文件的内容完全不同,唯一共同点是所有的数字都是9位数字.这次使用集合的方法求log2中log的补集。代码如下:
1 #!/usr/bin/env python
2 "File: filtermids.py --"
3
4 importre5
6 defmain():7 #read mids from the file
8 log = open("log", "r")9 log2 = open("log2", "r")10
11 m =[]12 n =[]13 x=re.compile("\d{9}")14
15 for line inlog:16 m = m +x.findall(line.strip())17 for line inlog2:18 n = n +x.findall(line.strip())19
20 log.close()21 log2.close()22
23 #或者使用 print " ".join(set(n)-set(m))
24 for a in list(set(n)-set(m)):25 printa,26
27 if __name__ == '__main__':28 main()