大きなテキストリストから重複したアイテムを削除する

大きなテキストリストから重複したアイテムを削除する

私はこれをインターネットとstackexchangeで検索しました。同様のトピックがたくさんありますが、まだ解決策が見つかりませんでした。

したがって、約5%の重複行があるかなり大きなリスト(約20GB)があります。重複したエントリの1つが削除されるように、このリストをフィルタリングしたいと思います。例:

入力する:

test123
Test123
test
test123
test 123

出力:

test123
Test123
test
test 123

リストがソートされたかどうかは重要ではありません。

私もsort -u -o output.txtそれを試しましたsort -us -o output.txt。小さなファイルにはうまく機能しますが、約より大きいファイルを処理しようとすると、4 GBの場合、結果ファイルは疑わしいほど小さくなり、.txtファイルの代わりに「emacs-lisp-source-text」になります。

誰でも私を助けることができればとても感謝します!

答え1

GNU coreutils 8.26でGNUを使用してテストしたところ、sort5GiBファイルの並べ替えに問題はありませんでした。だから、あなたはそれをインストールしようとすることができます。

しかし、覚えておくべきこと:

  • sort -u一意の行は提供されていませんが、すべての行の1つが等しくソートされています。具体的には、GNUシステムと一般的なロケールでは、複数の文字が等しく並べられています。バイトレベルで一意の行が必要な場合はを使用してくださいLC_ALL=C sort -u
  • sortメモリ全体をすべて使用したくない場合は、大規模入力に一時ファイルを使用してチャンクで並べ替えます。一時ディレクトリに十分なスペースがないと(通常/tmp設定されていない限り$TMPDIR)失敗します。十分な空き領域があるディレクトリに設定してください(GNUオプション$TMPDIRを参照)。-Tsort

答え2

printf"">出力ファイル
猫入力ファイル|
IFS =は-r行を読み取っています。
  もし[! -z "$line"];
    もし! grep -Fxqe "$line" 出力ファイル。
      echo "$line">>出力ファイル。
    フィリピン諸島
  フィリピン諸島
完璧

説明する

新しい出力ファイルの作成
printf "">OutputFile

入力ファイルをwhileループにパイプします。
cat InputFile |

各行を読む
while IFS= read -r line; do

空行処理
if [ ! -z "$line" ]; then

行がすでにOutputFileにあることを確認してください。
結果が空の場合、OutputFileにまだないことです(つまり、一意のものです)。
if ! grep -Fxqe "$line" OutputFile; then

出力ファイルに行を入れる
echo "$line">>OutputFile;

関連情報