メモ帳で重複行を削除する

メモ帳で重複行を削除する

Notepad++ で重複行を削除するにはどうすればいいですか? いくつかの例を見ましたが、多くは何年も前のものであり、解決策は現在機能しません。

画像

たとえば、次のようなものがあったとします。

Example
Example
1
1
3

希望:

Example
1
3

32ビットのNotepad++またはTextFx Toolsにはプラグインマネージャがないようです

答え1

ご検討いただけるよう、いくつかの解決策を提示しました。すでにご存知の内容について説明してもお許しください。=)

要約

Notepad++ v7.7.1以降、Notepad++には次のような機能があります。連続する重複行を削除するこれは、以下に示す他の 2 つのソリューションと同じことを行います (つまり、連続する重複行を削除します)。

アクセスするには編集 → 行操作 → 連続する重複行を削除


見るバートルビーの答え以下に、ソートせずに行の重複を削除する正規表現の例を示します。


元の回答

@máté-juhászのコメントによると、この質問に対する回答はStackOverflow の質問サンプルデータで動作します。

本質的に:

  • 開ける検索 → 置換...Notepad++ では( Ctrl+ ) です。H

  • 「検索対象」フィールドに以下を入力します正規表現:

     ^(.*?)$\s+?^(?=.*^\1$)
    
  • 「置換後:」フィールドは空白のままにして、「検索モード」オプションの「正規表現」を必ずチェックしてください。

  • 行を削除する準備ができたら、「すべて置換」をクリックします。

元の回答では、. matches newlineオプションをチェックする必要があると示されているようですが、コメントの一部の人々は、チェックを外したままにしておく方がうまくいったようです。あなたのデータでは、チェックを外したままにしましたが、うまく機能しているようでした。

例: 正規表現の使用

正規表現の置換例


uniqの使用

代替案として、他の選択肢があなたのニーズに合わないと仮定すると、UnixベースのWindowsポートをお持ちの場合は、ユニークユーティリティを使用すると、これを Notepad++ を使用したワークフローに統合できる可能性があります。

つまり、uniq上記の正規表現と同じ機能を実行しますが、より信頼性の高い方法で実行できます。欠点は、Notepad++ に組み込むのが少々面倒なことです。それを念頭に置いて、試してみたい場合は、基本的な手順を以下に概説します。

ユニークになる

まず、uniqWindows用ののコピーが必要です。いくつかのオプションが考えられますが、簡単にするために、GnuWin32 CoreUtils パッケージが含まれていますuniq。現在、ダウンロードできるのは軽量インストーラーCoreUtils パッケージ コンポーネントの zip バージョンを自分でダウンロードして結合しない場合。

ヒントとして、 を含むソリューションのすべてのステップでuniq、スペースを含むパスの使用をスキップします。 Unix では、ディレクトリ名内のスペースが Windows とは異なる方法で処理されることが多いため、その環境から移植されたユーティリティではスペースに関する問題が発生する可能性があります。


参考までに、 の GnuWin32 ビルドにどのようなファイル サイズ制限が適用されるかはわかりませんuniqが、少なくとも数メガバイトのデータ (多くの場合、数十万行) を含むテキスト ファイルに簡単に使用できます。


Notepad++ で uniq を使用する

インストールしたらuniq、バッチ ファイルに次の行のようなものを配置します。

C:\path\to\uniq.exe %* > C:\temp\uniq_tmp.txt
notepad++ C:\temp\uniq_tmp.txt
exit()

このバッチファイルを、使いやすいディレクトリに保存します。参照用に、これを次のように呼びます。uniq_npp.bat「temp」は任意のフォルダにすることができますが、「tmp」と「temp」は Windows に既に存在していることが多いことに注意してください。同様に、「uniq_tmp.txt」は、一貫して使用される限り、任意の名前にすることができます。

保存後uniq_npp.batこれで、Notepad++に機能を統合する準備が整いました。これを行うには、Notepad++を開きます。走る...メニュー ( F5) をクリックし、表示されるフィールドに次のような内容を入力します。

cmd /k C:\path\to\uniq_npp.bat "$(FULL_CURRENT_PATH)"

左端の「実行」ボタンをクリックすると、Notepad++ コマンドを保存する前にテストできます。

例: 実行...ダイアログ

実行ダイアログの例

それ以外の場合は、「保存...」をクリックしてコマンドに適切な名前を付けます。必要に応じてキーボードショートカットを割り当てることもできますが、必須ではありません。「OK」をクリックしてコマンド設定を保存し、走る...後で使用するためのドロップダウン メニュー。

例: ドロップダウンメニューの実行

実行メニューエントリの例


uniqご興味があれば、この回答の最後にある「メモ」セクションに、ソリューションがどのように機能するかについての詳細を簡単にまとめました。


注意点

このソリューションについて覚えておくべき重要なことはuniq絶対に必要ディスクに保存されたファイルへのパス (ドキュメントは Notepad++ だけでは開くことができません)。

これは、既に開いているファイルでは問題になりませんが、新しいファイルを作成したり、既存のファイルを変更したりする場合は、保存実行する前にまずuniq_npp.batファイル。そうでない場合、操作は失敗し、新しいデータはソートされません。

小さな利点として、この保存制限は上記の正規表現オプションには適用されないことを言及する価値があるでしょう。


ノート

ソート

提示された解決策 (つまり、最初の正規表現とuniq) では、重複する行が互いに直接重なって削除される必要があります。例:

duplicate line X
duplicate line X

つまり、これらの操作のいずれかを適用する前にデータを並べ替えることが重要です。サンプル データを考えると、すでにこれを実行していると思いますが、とにかく言及する価値はあります。

Notepad++ マクロ

ちょっとした提案ですが、Notepad++には組み込みの行並べ替え操作用のキーボードショートカットがないので、並べ替えを支援するマクロを記録することをお勧めします。具体的には、編集 → すべて選択Ctrl+ A)操作を行い、編集 → 行操作 → 行を辞書順に並べ替えオプション。

解決策としてはuniq、並べ替えマクロの最終ステップとして「保存」操作を記録することも検討する価値があるかもしれません。また、正規表現オプションの手順 (置換ダイアログを開く、正規表現を入力するなど) も便利なマクロに記録できることにも注意してください。

uniqソリューションの仕組み

簡単に言うと:

  • 「実行...」行はコマンドウィンドウ(cmd /k)を起動し、uniq_npp.bat現在選択しているファイルが保存されている場所へのパスを指定します。

  • uniq_npp.bat%*、このパスは に渡されるワイルドカードによってキャプチャされますuniq。 からの重複排除されたデータは、uniqその後>「uniq_tmp.txt」にリダイレクトされます ( )。

  • 最後に、バッチ ファイルは、このクリーンアップされたテキストを新しい Notepad++ タブで開き、コマンド ウィンドウは によって閉じられますexit()

uniq_npp.bat の改善 (?)

並べ替えに関しては、Notepad++を使わずに並べ替えるという選択肢もあります。並べ替えオプションに関する柔軟性が失われる可能性がありますが、バッチファイルの追加ステップとしてアイテムを並べ替えるだけで済みます。Windows の並べ替えコマンド。このステップを追加するには、uniq_npp.bat次のように:

sort %* | C:\path\to\uniq.exe > C:\temp\uniq_tmp.txt

これは、ソートされたデータを から にパイプするだけですsortuniqご覧のとおり、sortは最初に ではなく、データ パスをキャプチャしますuniq

もう 1 つの考えは、(おそらく)%*ワイルドカードを文字列操作の一部として使用して元のファイル名を取得し、たとえば「uniq_tmp.txt」を「original-filename_uniq.txt」のようなものに置き換えて、より一意にすることです。

潜在的な落とし穴

  • デフォルトでは、Windowsはsort数字を次のように並べ替えます。

     1
     11
     2
     21
    

先頭に 0 が付かない場合 (例01, 02, 011, 021)。

  • GnuWin32 CoreUtilsパッケージには、Unix ソートユーティリティ (Windows よりも強力なオプションがありますsort) とは異なり、この特定の実装 (ほとんどの GnuWin32 ユーティリティとは異なり) は Windows では少し貧弱であるように思われます。ただし、Unix バージョンの の別の Windows ポートを使用する場合sort、この問題は当てはまらず、全体的に優れたオプションになる可能性があります。

答え2

順序が揃っていないアイテムの場合、これがうまく機能することがわかりました。

検索: (?s)^(.*?)$\s+?^(?=.*^\1$)

「置換後の文字列:」フィールドに何も入力せずに、「すべて置換」をクリックします。

編集:

手順は次のとおりです。

(?s) ドットは改行にも一致します。

^ 行頭

(.*?)$ 最初に検出された行末まで、任意の文字の 0 個以上を非貪欲に一致させることにより、最初のキャプチャ グループを確立します。

\s+? 1つ以上の空白文字に一致します(貪欲ではありません)

^ 行頭(再び)

(?= 非キャプチャ グループを使用した肯定的な先読み (このパターンは一致する必要がありますが、保存されません)。

.*^\1$) 0 個以上の文字を貪欲に一致させ、行全体が最初のキャプチャ グループと一致する新しい行まで続けます。

したがって、正規表現はキャプチャ グループを作成し、その行と正確に一致する行が見つかるまでドキュメント内のすべての行を検索し、元の行を何もない状態に置き換えます。

追記:当時は考えていませんでしたし、正規表現の作成者に謝罪しますが、スコット誰かが作った正規表現を少しだけ変更したバージョンを使っていたという点では正しいです。その起源を推測すると、おそらく彼が提供したリンク内で実際にクレジットされている答えである可能性が高いと思います。ここ

最後に、以下の点についてお詫び申し上げます。

  1. 当然認められるべきところに功績を認めなかった。当時はそれについて考えていませんでしたが、そうすべきでした。
  2. 私が提供した回答を完全に説明していないため、何が起こっているかについての理解が深まり、その情報を他の問題に活用できるようになる可能性があります。
  3. スコットのコメントにもっと早く返信しませんでした。私はこのサイトの使い方にそれほど詳しくないので(そのためスコアが低いのです)、今日まで通知を確認することを考えませんでした。

私の過ちです!

答え3

ありがとうございます。ただし、regex と uniq は、隣り合う重複行のみを検出しました。代わりにこの awk スクリプトを awkuniq-npp.bat として使用すると、Notepad++ と互換性があります。4 行の bat ファイル:

C:\pathto\awk.exe '(a[$0]++==0)' %* > %*.1
削除 %*
%*.1 %* を移動
出口()
実行するコマンド:

cmd /k C:\pathto\awkuniq-npp.bat "$(FULL_CURRENT_PATH)"

削除/移動後に自動リロードを使用して同じファイル名を置き換えます

答え4


私は次の検索/置換正規表現を使用します (行をソートした後)。より直感的に理解できると思います。

Find: (.*)\r?\n(\1\r?\n)+

Replace with: \1\r\n

説明:
- 「何か」(テキストの行) の後に新しい行 (\n または \r\n) が続くものを探します。\r?\n
- 行の内容を変数に保存します: (。
)\r?\n
- 同じ行が 1 回以上出現する箇所を検索します: (.*)\r?\n(\1\r?\n)+

置換: - 上記のすべてを、行自体と新しい行のみに置き換えます: \1\r\n

役に立つといいですね、
sb3k

関連情報