入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

如何求两个文件的交集、并集和差集?------sort和uniq闪亮登场

创建时间:2015-12-26 投稿人: 浏览次数:5058

        在日常开发中, 经常要对一些数据进行处理。 写个程序吧, 也可以实现, 但蛮麻烦的, 有些时候根本没有必要。 现在, 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的习惯。 另外, 求差集的方法非常巧妙, 需要仔细琢磨一下。





声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。