这个是很常见的需求,假如两个文件
123 456 789
123 789 abc
我等劳模,上来就挽袖子,自己写脚本了
#!/usr/bin/env python
import sys
def calc_uniq(file1, file2):
file1 = open(file1)
file2 = open(file2)
set1 = set()
set2 = set()
for line in file1:
set1.add(line)
for line in file2:
set2.add(line)
set_intersection = set1 & set2
print file1.name, "uniq item:", len(set1)
print file2.name, "uniq item:", len(set2)
print "intersection len:", len(set_intersection)
print "intersection detail:"
print set_intersection
file1.close()
file2.close()
if __name__ == "__main__":
if len(sys.argv) == 3:
calc_uniq(sys.argv[1], sys.argv[2])
else:
print "this script calculate the intersection of two files"
print "usage:", sys.argv[0], "path_to_file1 path_to_file2"
倒也能跑
1 uniq item: 3 2 uniq item: 3 intersection len: 2 intersection detail: set(['789\n', '123\n'])
但是搜一下,看到这里,http://blogread.cn/it/article/…
1. 取出两个文件的并集(重复的行只保留一份)
cat file1 file2 | sort | uniq
2. 取出两个文件的交集(只留下同时存在于两个文件中的文件)
cat file1 file2 | sort | uniq -d
3. 删除交集,留下其他的行
cat file1 file2 | sort | uniq -u
感觉瞬间挫爆了,辛辛苦苦那么多行,人家一行就搞定
但是,等等,看看这个用例
123 123
456 456
来看输出
$ cat 1 2 | sort | uniq -d 123 456
傻了吧
不过另外又看到这里,http://www.commandlinefu.com/c…
grep -Fx -f file1 file2
这个更加霸气啊,而且还不出错,真是把 shell 玩出花了