uniqr — 行単位の重複除去ツール(Rust製)

Tool

概要

uniqrは「順序を保ったまま行の重複を取り除く」ことに特化したコマンドラインツールです。従来のsort | uniqのようにソートを強制せず、入力に現れた元の行順を維持できる点が最大の特徴。基本モードとして「最初を保持(KeepFirst)」「最後を保持(KeepLast)」「重複行をすべて削除(RemoveAll)」を備え、さらに大文字小文字を区別しないマッチングや、指定したカラム(列)だけで重複判定を行う機能も提供します。Rust製のため実行速度とメモリ効率に優れ、パイプやリダイレクトとの相性が良い設計が想定されています。シンプルなユースケースからログ前処理、データクリーニングまで幅広く使えるツールです。

GitHub

リポジトリの統計情報

  • スター数: 1
  • フォーク数: 0
  • ウォッチャー数: 1
  • コミット数: 2
  • ファイル数: 7
  • メインの言語: Rust

主な特徴

  • 順序保持(Order-Preserving):入力の行順をそのまま維持して重複除去を行う
  • 複数モード:KeepFirst / KeepLast / RemoveAll の3モードをサポート
  • オプション機能:大文字小文字無視、特定カラムだけでの重複判定など実用的なオプション
  • CLIフレンドリー:標準入力/出力やパイプ処理を前提にした使い勝手

技術的なポイント

uniqrは「順序を保ちつつ重複を取り除く」という要件に対して、いくつかのアルゴリズム的選択肢を取ることになります。KeepFirstモードでは典型的にはHashSetを用いて出現済みのキー(行全体か、指定カラム、あるいは正規化した文字列)を保持し、初出の行のみを出力するストリーミング処理が可能です。この方法は一回読みで済み、メモリはユニークキー数に比例します。KeepLastモードは「最後の出現を残す」必要があるため、単純な一回読みストリームでは実現が難しく、一般的には全行を一度バッファ化してキーと最後に出現したインデックスを記録した後、最後に選択した行だけ出力するか、あるいは逆順で読み処理して出力を逆順で整えて戻すアプローチが考えられます。RemoveAllモードは各キーの出現回数をカウントするためHashMapで回数集計を行い、2フェーズで出力時に出現回数が1の行のみを残す実装が自然です。

ケース非依存マッチングはUnicodeの扱い(単純なto_lowercaseかより厳密なcase-foldingか)を選択するポイントです。列ベースの重複判定では、行を区切り文字(空白やタブ、カンマなど)で分割して特定カラムをキーにする実装になります。パフォーマンス面では、Rustのイテレータと所有権モデルにより文字列バッファの再割当を抑えつつ安全に高速化できる利点があります。さらに、大きなファイルを扱う場合はストリーミングでの処理(KeepFirstやRemoveAllの集計のみ)はメモリ効率が良く、KeepLastのような全体保持が必要なモードはメモリ負荷が高くなるため、ドキュメントで注意喚起するのが望ましいでしょう。

CLI設計ではパイプ入力・出力、ファイル指定、エラー時の明確なメッセージ、EXITコードの整備が重要です。将来的には並列化(チャンクごとの部分集計とマージ)やメモリ使用量を抑えるための外部ソート的手法の導入も検討できます。ライブラリ化してプログラムから呼べるAPIを提供すれば、他ツールとの連携やテストも容易になります。

プロジェクトの構成

主要なファイルとディレクトリ:

  • .gitignore: file
  • Cargo.lock: file
  • Cargo.toml: file
  • LICENSE: file
  • README.md: file

…他 2 ファイル

(補足)リポジトリはRust製ツールらしくCargoのメタファイルを持ち、小規模なコードベースでコマンド実装に集中している構成が想定されます。READMEには使用例やモード説明があり、実用上のオプションがまとめられています。

まとめ

シンプルで実用的な順序保持型行重複除去ツール。Rustの性能でログや大量テキスト処理に有効。

リポジトリ情報:

READMEの抜粋:

uniqr

A fast line deduplication tool that preserves order, written in Rust.

Features

  • Order-Preserving: Unlike sort | uniq, uniqr maintains the original order of lines
  • Multiple Modes:
    • KeepFirst: Keep the first occurrence of each line (default)
    • KeepLast: Keep the last occurrence of each line
    • RemoveAll: Remove all lines that appear more than once
  • Case-Insensitive Matching: Optional case-insensitive deduplication
  • **Column-Based Deduplicat…