因为公司业务的迭代,须要对部分数据进行筛洗,涉及到对大文件的排序和去重。刚开始接触到这个这个任务,也是想尽各类方法, redis、bitmap 或者优秀的排序算法等,但最后都发现实现这些方法比较繁琐,并且极其吃内存,不是很可行。在百抓挠腮之际,看到了一些优秀回答者的建议,就是利用sort进行排序,而后再利用uniq进行去重。html
刚开始看到这个回答,我是持有怀疑态度的。可是通过实践发现,利用 uniq 和 sort 指令,其中间数据不会所有存在内存中,而是大部分存在磁盘里,是很是安全的作法。处理了几个4G左右的文件,速度也是很是快的。下面将这些如何使用这两个指令,作一个总结,方便后面的回顾。linux
先利用cat,看看原有的内容:redis
$ cat testfile #原有内容
test 30
test 30
Hello 95
Hello 95
Linux 85
Linux 85
复制代码
使用uniq 命令删除重复的行后,有以下输出结果:算法
$ uniq testfile #删除重复行后的内容
test 30
Hello 95
Linux 85
复制代码
可是咱们如今又面临一个问题,就是若是重复的行是不相邻的,是没有办法去重的。不慌,能够利用另外一个指令,sort + 管道 + uniq:安全
$ sort testfile | uniq
Hello 95
Linux 85
test 30
复制代码
其次,若是咱们还想统计各行在文中出现的次数:bash
$ sort testfile | uniq -c
2 Hello 95
2 Linux 85
2 test 30
复制代码
最后,咱们还想根据出现的次数进行排序,sort的-n参数能够帮助咱们实现这个功能,重定向到tmp.csv的文件中:ui
sort testfile | uniq -c | sort -n > tmp.csv
复制代码
这些简单的指令能够帮助咱们快速地实现文件排序去重。目前来看,对中型文件,速度仍是能够的。但愿后面有机会的话,能够了解一下uniq和sort的实现原理,知其然,也知其因此然。spa