2013-06-01 69 views
10

我有大約350個文本文件(每個文件大約75MB)。我正在嘗試合併所有文件並刪除重複的條目。該文件的格式如下:合併多個文本文件並刪除重複項

ip1,dns1 
ip2,dns2 
... 

我寫了一個小的shell腳本來做到這一點

#!/bin/bash 
for file in data/* 
do 
    cat "$file" >> dnsFull 
done 
sort dnsFull > dnsSorted 
uniq dnsSorted dnsOut 
rm dnsFull dnsSorted 

我經常這樣處理,並想知道如果有什麼我可以做些什麼來改善當我運行它時下一次處理。我接受任何編程語言和建議。謝謝!

+0

你也可以給排序-ma嘗試 - >它將排序單個文件並相應地合併它們,因此應該節省相當多的時間.... -m選項可用espl用於這種情況...即排序-m文件* | uniq -u – nsd

回答

30

首先,您沒有使用cat的全部功率。循環可以被替換爲

cat data/* > dnsFull 

假設文件最初是空的。

再有就是所有的強制程序等待硬盤(通常在現代計算機系統中最慢的部分)的臨時文件。使用管道:

cat data/* | sort | uniq > dnsOut 

這仍然是因爲單獨sort浪費可以做你正在使用的catuniq的;整個腳本可以通過

sort -u data/* > dnsOut 

被替換如果這仍然不夠快,然後意識到排序需要O(N LG n)的時間,而重複數據刪除可以在線性時間內完成使用awk:

awk '{if (!a[$0]++) print}' data/* > dnsOut 
+0

很好說,謝謝。 – drk

+5

請注意,最終的awk可以簡化爲'awk'!a [$ 0] ++'data/*' –

+1

我刪除了我的perl答案,因爲350 * 75MB =超過26GB - 內存中的排序(如awk)會導致交換太多內存。 – jm666

相關問題