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
ネストされたループが多いほど、一度に処理される単語の数が少なくなり、実行速度が遅くなります。
他のすべてのファイルをチェックする予定のリストファイルが1つあるか、すべてのファイルを他のすべてのファイルと照合する予定ですか? –
大丈夫なので、最初のファイルを使って他の500をチェックし、一度チェックしてすべてのダプを削除してから、2番目のファイルを開始して、すべて完了するまで同じ操作をします。 – Hopelessone