2016-08-25 12 views
0

難しいですが、私は1/2TBのテキストファイルをフォルダに持っています。私は、テキストファイル名を保持し、1ファイルにマージしない。1つのファイルからdupe行を削除し、同じ行にあるすべてのファイルに対して各行をチェックする方法

テキストファイルを調べ、各行を他のファイルと比較するにはどうすればよいですか?

すべての単語dupsをディレクトリ全体から削除します。いくつかのファイルは38GBもの大きなものです。

例えば、すべて:

textfile1.txtはパワー

textfile2.txtもこの言葉パワーを持っており、 などを削除する必要があります...

編集デュープ単語を持っています単語は改行で区切られます。

同じディレクトリ内のすべてのファイルを終了するまで。 Linuxでも勝利でも。

+0

他のすべてのファイルをチェックする予定のリストファイルが1つあるか、すべてのファイルを他のすべてのファイルと照合する予定ですか? –

+0

大丈夫なので、最初のファイルを使って他の500をチェックし、一度チェックしてすべてのダプを削除してから、2番目のファイルを開始して、すべて完了するまで同じ操作をします。 – Hopelessone

答えて

1
awk -i inplace '!seen[$0]++' * 

上記の「インプレイス」編集用のGNU awk 4. *です。あなたの最大のファイルのコピーを作成し、メモリ内のすべてのユニークな単語のリストを保持するのに十分なメモリが必要です。上記の説明では、あなたの "言葉"が改行で区切られていると仮定しています。

あなたの最大のファイルをコピーするための十分なメモリを持っていない場合は、あなたのような何かを試みることができる:

for file in * 
do 
    while [ -s "$file" ]; do 
     # copy the first 100 lines from "$file" into tmp 
     head -n 100 "$file" > tmp 

     # inplace remove the first 100 lines from "$file" 
     count=$(head -100 "$file" |wc -c) 
     dd if="$file" bs="$count" skip=1 of="$file" 
     truncate -s "-$count" "$file" 

     # somehow get a subset of words to check in tmp 
     awk 'magic happens' tmp >> "${file}.new" && 
     rm -f tmp 
    done 
done 

をしかし、あなたはで確認する単語のグループを思い付くする方法を理解する必要があります時間がかかる(例えば下記参照)、これは遅くなり、慎重に踏み込んで、まずファイルのバックアップを作成してください!

各ファイルのコピーを作成することができますが、一度にメモリ内の「言葉」のすべてに適合することができないならば、あなたのような何かを行うことができます:ベースの単語のグループを探すために

for a in {a..z} 
do 
    awk -v start="^$a" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' * 
done 

をいくつかの特性、例えば(拡大する正規表現パターンを表示する)

for a in {a..z} 
do 
    awk -v start="^$a$" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' * 
    for b in {a..z} 
    do 
     awk -v start="^$a$b" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' * 
    done 
done 

以上:これらのバッチが大きすぎる場合aで始まるすべての単語のための上記のルックスは、その後、bなどで、内側のループを追加

for a in {a..z} 
do 
    awk -v start="^$a$" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' * 
    for b in {a..z} 
    do 
     awk -v start="^$a$b$" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' * 
     for c in {a..z} 
     do 
      awk -v start="^$a$b$c" -i inplace -v IGNORECASE=1 '!($0~start && seen[$0]++)' * 
     done 
    done 
done 

ネストされたループが多いほど、一度に処理される単語の数が少なくなり、実行速度が遅くなります。

+0

最大ファイルは100GBではありません。 – Hopelessone

+0

与えられたファイルがそれをやめることを止めないなら、利用可能なメモリの量があなたを止めます。最大のファイルのコピーを作成するのに十分なメモリがない場合は、**実際に** UNIXのファイルを「実際に」編集することはできません。すべてのツールはそうしていると言います(awk、 sed、perlなど)は実際に内部的にファイルのコピーを作成します。その場所のファイルを本当に編集するには、私がhttp://stackoverflow.com/a/17331179/1745001に示すような何かをする必要があり、このアプリケーションのために幸運を祈る! –

+0

ここの最初の答えでこの男は何を言っていますか? http://stackoverflow.com/questions/32048401/python-removing-dupes-from-large-text-file – Hopelessone

関連する問題