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