有一道校招生的面試題,是要給乙個很大的檔案(不能全部放記憶體,比如1t)按行來排序和去重。
一種簡單解決方案就是分而治之,先打大檔案分詞大小均勻的若干個小檔案,然後對小檔案排好序,最後再merge所有的小檔案,在merge的過程中去掉重複的內容。
在 linux下實現這個邏輯甚至不用自己寫**,只要用shell內建的一些命令: split, sort就足夠了。我們把這個流程用指令碼串起來,寫到shell指令碼檔案裡。檔案名叫sort_uniq.sh.
複製**
1 #!/bin/bash
2 lines=$(wc -l $1 | sed 's/ .*//g')
3 lines_per_file=`expr $lines / 20`
4 split -d -l $lines_per_file $1 __part_$1
5 6 for file in __part_*
7 do
8 &
11 done
12 wait
13 14 sort -smu sort_* > $2
15 rm -f __part_*
16 rm -f sort_*
複製**
使用方法:./sort_uniq.sh file_to_be_sort file_sorted
這段**把大檔案分詞20或21個小檔案,後台並行排序各個小檔案,最後合併結果並去重。
如果只要去重,不需要排序,還有另外一種思路:對檔案的每一行計算hash值,按照hash值把該行內容放到某個小檔案中,假設需要分詞100個小檔案,則可以按照(hash % 100)來分發檔案內容,然後在小檔案中實現去重就可以了。
超級簡單的方法實現去重與排序
程式設計題 字串中字元排序 問題描述 編寫乙個程式,從鍵盤接收乙個字串,然後按照字元順序從小到大進行排序,並刪除重複的字元。輸入形式 使用者在第一行輸入乙個字串。輸出形式 程式按照字元 ascii 順序從小到大排序字串,並刪除重複的字元進行輸出。樣例輸入 badacgegfacb 樣例輸出 abcd...
類似 , 等陣列的去重和排序
一般的陣列的去重和排序就不介紹了 現在有兩個陣列 date 降序 function sortdown a,b 公升序 function sortup a,b 降序呼叫 date date.sort sortdown date date.sort sortup 把相同goods name的ip進行去重...
sql 排序去重的方法
id name course score 1001 李四 英語 100 1007 王五 數學 30 1004 李四 數學 62 1005 李四 語文 83 1006 王五 語文 55 1008 張三 英語 64 1003 王五 英語 56 1002 張三 數學 93 1000 張三 語文 81 先根...