在日常开发中, 经常要对一些数据进行处理。 写个程序吧, 也可以实现, 但蛮麻烦的, 有些时候根本没有必要。 现在, a.txt和b.txt两个文件的数据都是逐行呈现的, 我们来说说如何求他们的交集、并集和差集。a.txt和b.txt中的内容为(注意, 高中时学的集合具有互异性, 而文件中的行却不一定有互异性):
taoge@localhost test> cat a.txt
xxx
111
xxx
taoge@localhost test> cat b.txt
111
888
先说交集。 某次, 在某重要面试中, 遇到这样一个算法题: a.txt有3000万个无符号整数, 在b.txt中有3000个无符号整数, 求交集。 我当时给出了bitmap解决方法, 还算靠谱。 现在想来, 虽然是算法题目, 但如果答完后补充用命令来做, 那就更好了。
网上求交集的答案为:cat a.txt b.txt | sort | uniq -d ,但是, 这个答案是有问题的, 比如:
taoge@localhost test> cat a.txt b.txt | sort | uniq -d
111
xxx
taoge@localhost test>
正确的命令应该是:
taoge@localhost test> sort a.txt | uniq > aa.txt
taoge@localhost test> sort b.txt | uniq > bb.txt
taoge@localhost test> cat aa.txt bb.txt | sort | uniq -d
111
taoge@localhost test>
d是duplicate的缩写, 表示输出重复的行。
再看并集, 这个很简单:
taoge@localhost test> cat a.txt b.txt | sort | uniq
111
888
xxx
taoge@localhost test>
再看差集,网上给出的错误方法为:cat a.txt b.txt b.txt | sort | uniq -u,比如:
taoge@localhost test> cat a.txt b.txt b.txt | sort | uniq -u
taoge@localhost test>
正确的方法为:
taoge@localhost test> sort a.txt | uniq > aa.txt
taoge@localhost test> sort b.txt | uniq > bb.txt
taoge@localhost test> cat aa.txt bb.txt bb.txt | sort | uniq -u
xxx
taoge@localhost test>
u是unique的缩写, 表示输出唯一的行。
回头看一下, 在求交集和差集的时候, 一定要注意, 养成先对文件sort和uniq的习惯。 另外, 求差集的方法非常巧妙, 需要仔细琢磨一下。