因爲公司業務的迭代,須要對部分數據進行篩洗,涉及到對大文件的排序和去重。剛開始接觸到這個這個任務,也是想盡各類方法, 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