利用uniq和sort指令,實現對文件的排序去重

引言

因爲公司業務的迭代,須要對部分數據進行篩洗,涉及到對大文件的排序和去重。剛開始接觸到這個這個任務,也是想盡各類方法, redis、bitmap 或者優秀的排序算法等,但最後都發現實現這些方法比較繁瑣,並且極其吃內存,不是很可行。在百抓撓腮之際,看到了一些優秀回答者的建議,就是利用sort進行排序,而後再利用uniq進行去重。html

剛開始看到這個回答,我是持有懷疑態度的。可是通過實踐發現,利用 uniq 和 sort 指令,其中間數據不會所有存在內存中,而是大部分存在磁盤裏,是很是安全的作法。處理了幾個4G左右的文件,速度也是很是快的。下面將這些如何使用這兩個指令,作一個總結,方便後面的回顧。linux

uniq

先利用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

可是咱們如今又面臨一個問題,就是若是重複的行是不相鄰的,是沒有辦法去重的。不慌,能夠利用另外一個指令,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

參考

相關文章
相關標籤/搜索