各行の正確なレプリカが約100個含まれる巨大な(最大2GiB)テキストファイルがあります(私の場合、ファイルはCSVに似たデータテーブルなので役に立ちません)。
私にとって必要なのは、元のシーケンス順序を維持しながら(可能な限り大幅なパフォーマンスを向上させるために犠牲にすることができます)、すべての重複エントリを削除することです。その結果、各行は一意です。 100本の同じ行がある場合(通常は重複する行はファイル全体に広がっていて近隣ではありません)、そのうちの1つだけが残ります。
私はこの機能を実装するためにScalaでプログラムを作成しました(Scalaがわからない場合はJavaの使用を検討してください)。しかし、これをより速く実行できるCで書かれたより速い基本ツールがありますか?
更新:awk '!seen[$0]++' filename
このソリューションは、ファイルが2GiB以下に近いと正常に動作するように見えましたが、8GiBファイルをクリーンアップしようとすると、もう機能しません。 4GiB RAMを搭載したMacと4GiB RAMと6GiBスワップを搭載した64ビットWindows 7 PCでは、メモリ不足で終わりがないようです。このような経験を考えると、私は4GiB RAMを搭載したLinuxで試すことに熱心ではありませんでした。
ベストアンサー1
awk
#bash(Freenode)で見られる解決策:
awk '!seen[$0]++' filename
ファイルをその場で編集するには、次のコマンドを使用できます(この拡張を実装するGNU awkバージョンを使用している場合)。
awk -i inplace '!seen[$0]++' filename