2013-06-01 29 views
10

私はおよそ350のテキストファイルを持っています(それぞれのファイルは約75MBです)。私はすべてのファイルを結合し、重複したエントリを削除しようとしています。ファイルのフォーマットは次のとおりです。複数のテキストファイルを結合して重複を取り除く

ip1,dns1 
ip2,dns2 
... 

私は、多くの場合、この処理をやっていると私は改善するために何ができるものがあるかどうかと思いまして、この

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

を行うには、小さなシェルスクリプトを書きました私はそれを実行する次回の処理。私はどのプログラミング言語や提案にもオープンしています。ありがとう!

+0

あなたはsort -ma try - >これを使って個々のファイルをソートし、それに応じてマージするので、時間がかなり節約できます.... -mオプションは、このようなシナリオではesplで利用できました... sort -mファイル* |ユニーク-u – nsd

答えて

30

まず、catのフルパワーを使用していません。ループは、ファイルが最初は空であると仮定して、

cat data/* > dnsFull 

と置き換えることができます。

これらの一時ファイルはすべて、プログラムがハードディスク(一般に最新のコンピュータシステムでは最も遅い部分)を待つように強制します。パイプラインを使用してください:

これはまだあなたが catuniq用を使用しているものを行うことができますだけでは sort以来の無駄である
cat data/* | sort | uniq > dnsOut 

。これは十分に速く、その後、重複排除がAwkの線形時間で行うことができる一方、そのソートはO(n個のLG n)の時間がかかる実現はまだされていない場合、スクリプト全体が

sort -u data/* > dnsOut 

によって置き換えることができます。

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

非常によく言った、ありがとう。 – drk

+5

最終的なawkは 'awk 'に簡略化することができます!a [$ 0] ++' data/*' –

+1

350 * 75MB = 26GBを超えるメモリー内ソート(awkなど)あまりにも多くのメモリを交換。 – jm666

関連する問題