Usuwanie zduplikowanych wierszy w Notepad ++


595

Czy można usunąć zduplikowane wiersze w Notepad ++, pozostawiając tylko jedno wystąpienie linii?

Odpowiedzi:


759

Notepad ++ może to zrobić, pod warunkiem, że chcesz sortować według linii i usuwać zduplikowane linie w tym samym czasie.

Będziesz potrzebował wtyczki TextFX. To było dołączane do starszych wersji Notepad ++, ale jeśli masz nowszą wersję, możesz dodać ją z menu, przechodząc do Plugins -> Plugin Manager -> Show Plugin Manager -> Available tab -> TextFX -> Install. W niektórych przypadkach można go również nazwać TextFX Characters, ale to jest to samo

Pola wyboru i przyciski wymagane będą teraz wyświetlane w menu poniżej: TextFX -> TextFX Tools.

Upewnij się, że zaznaczono opcję „sortuj tylko unikalne ...”. Następnie wybierz blok tekstu ( Ctrl+, Aaby zaznaczyć cały dokument). Na koniec kliknij „sortuj linie z rozróżnianiem wielkości liter” lub „sortuj linie bez rozróżniania wielkości liter”

układ menu w n ++


32
Niezwykle potężna wtyczka, pomimo „wieku”. Mam nadzieję, że NIGDY nie usuną tego ze standardowej oferty wtyczek NPP. Facet, który pomyślał o wszystkich funkcjach tej wtyczki, był swego rodzaju „wizjonerem”.
— GeertVc

7
Silniejszy niż Excel.
— Vasu,

6
Co z wersją Notepad ++ x64? Wtyczka TextFX wersja x64 nie istnieje
— Geograf

15
TextFx nie jest w wersji 64-bitowej.
— Rhyous,

4
@Geograph I nie będzie 64-bitowej wtyczki TextFx. Zobacz tę notatkę . Dlatego dobrze byłoby wiedzieć, czy istnieje alternatywna wtyczka zapewniająca sortowanie i usuwanie duplikatów.
— Robert

641

Od wersji 6 Notatnika ++ możesz używać tego wyrażenia regularnego w dialogu wyszukiwania i zamiany:

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

i zastąpić niczym . Pozostawia to ze wszystkich zduplikowanych wierszy ostatnie wystąpienie w pliku.

W tym celu nie jest wymagane sortowanie, a zduplikowane wiersze mogą znajdować się w dowolnym miejscu pliku!

Musisz zaznaczyć opcje „Wyrażenie regularne” i „. Pasuje do nowego wiersza”:

Notepad ++ Zastąp dialog

  • ^ dopasowuje początek linii.

  • (.*?)dopasowuje dowolne znaki 0 ​​lub więcej razy, ale tak mało jak to możliwe (pasuje dokładnie w wierszu, jest to konieczne ze względu na opcję „. pasuje do nowej linii”). Dopasowany wiersz jest przechowywany ze względu na nawiasy wokół i dostępny przy użyciu\1

  • $ dopasowuje koniec linii.

  • \s+?^ ta część pasuje do wszystkich białych znaków (nowych linii!) do początku następnego wiersza ==> Usuwa to nowe wiersze po dopasowanym wierszu, dzięki czemu po wymianie nie ma pustego wiersza.

  • (?=.*^\1$)jest to pozytywne stwierdzenie z wyprzedzeniem. Jest to ważna część tego wyrażenia regularnego, wiersz jest dopasowywany (i usuwany) tylko wtedy, gdy dokładnie ten sam wiersz występuje w innym miejscu pliku.


10
och, ten jest genialny, usuwa nawet puste wiersze, w tej chwili
— robię makra

66
W niektórych przypadkach po prostu usuwa WSZYSTKIE linie w pliku.
— SerG

3
Czy jest jakiś sposób na usunięcie OSTATNIEGO wystąpienia? To pasuje do wszystkich oprócz ostatniego ...
— Cullub,

28
W moim przypadku, gdy to rozwiązanie usunęło wszystkie linie, odznaczenie . matches newlinezrobiło lewę.
— Kuitsi,

3
@SerG W niektórych przypadkach to też nie działało, ale kiedy usunąłem „pasuje do nowej linii”, zadziałało :)
— Davidenko,

95

Jeśli wiersze znajdują się bezpośrednio po sobie, możesz użyć wyrażenia regularnego:

Wzór wyszukiwania: ^(.*\r?\n)(\1)+

Zamienić: \1


1
Może inni mieli z tym szczęście, ale dla mnie ^ (. * \ N) \ 1 powoduje, że „nie mogę znaleźć tekstu”
— b1nary.atr0phy 28.04. O

4
@ b1naryatr0phy upewnij się, że masz „Tryb wyszukiwania” ustawiony na „Wyrażenie regularne”, zaktualizowałem również wzorzec, aby mógł obsługiwać zakończenia linii w stylu Windows
— Grant Peters

3
notepad ++ ma lekki silnik regex, nie pozwala na zaawansowane funkcje, nawet „? lub \ r \ n”, ponieważ działa tylko w jednym wierszu i używasz $ dla znaków \ ​​r \ n
— Stefan Rogin

3
to eliminuje jeden po drugim. Musisz to powtórzyć wiele razy. Zastanawiam się, dlaczego \ n + -> \ n nie działa (myślał, że zgłasza wiele wymian)
— Val

2
@ Val, jeśli utworzysz część odniesienia z odniesieniem dla grupy wymagającej 1 lub więcej dopasowań, wzór będzie pasował do N ciągłych zduplikowanych linii na raz:^(.*\r?\n)(\1)+
— Kenigmatic

37

Notepad ++

-> Zastąp okno

Upewnij się, że w trybie wyszukiwania wybrałeś przycisk radiowy Wyrażenie regularne

Znajdź co:

^ (. *) (\ r? \ n \ 1) + $

Zamienić:

1 USD

Przed:

i myślimy tam

i myślimy tam

pojedyncza linia

Czy jest możliwe

Czy jest możliwe

Po:

i myślimy tam

pojedyncza linia

Czy jest możliwe


2
Czy plik nie musi być posortowany, aby to zadziałało?
— Peter Mortensen

to jest genialne
— Remo Liechti

30

Jeśli nie obchodzi Cię kolejność wierszy (co nie wydaje mi się, że tak), możesz użyć pola Linux / FreeBSD / Mac OS X / Cygwin i wykonać:

$ cat yourfile | sort | uniq > yourfile_nodups

Następnie otwórz plik ponownie w Notepad ++.


3
Nie działa w systemie Windows 7.'cat' is not recognized as an internal or external command, operable program or batch file.
— Iain Samuel McLean Starszy

2
@Iain Elder: cat jest standardowym narzędziem Uniksa, dlatego ta odpowiedź określa, że ​​działa on w systemach Linux, FreeBSD i MacOSX. Odpowiedź sugeruje również Cygwyn: To program Windows, który daje powłokę w stylu unix, a wraz z nią cat. Krótka historia (za późno!): Win 7 potrzebuje Cygwin, aby to zrobić.
— Travis Clark,

11
W systemie Windows masz PowerShell:cat yourfile | sort -Unique
— Elazar

9
Są to dobre przykłady „nieuzasadnionego użycia kota”. Zapomnij o narzędziu cat i po prostu użyj przekierowania pliku w ten sposób: sort <twój plik | uniq> yourfile_nodups
— scott8035

1
@ scott8035, zgadzam się, że cat nie ma sensu uruchamiać tego polecenia, ale często pomocne jest rozpoczęcie od kota, gdy zastanawia się nad długą sekwencją nieoczywistych poleceń, takich jak plik cat | sed ... | sed ... | sed ... i tak dalej. Powiedziałbym więc, że mogą istnieć powody korzystania z kota. Oczywiście kota można usunąć na końcu, ale niektóre są na to zbyt leniwe.
— FORTRAN

17

Te ostatnie wersje Notepad ++ najwyraźniej w ogóle nie zawierają wtyczki TextFX. Aby użyć wtyczki do sortowania / eliminowania duplikatów, wtyczka musi zostać pobrana i zainstalowana (bardziej zaangażowana) lub dodana za pomocą menedżera wtyczek.

A) Łatwy sposób (jak opisano tutaj ).

Wtyczki -> Menedżer wtyczek -> Pokaż menedżera wtyczek -> Karta Dostępne -> Znaki TextFX -> Zainstaluj

B) Bardziej zaangażowany sposób, jeśli potrzebna jest inna wersja lub prosty sposób nie działa.

  1. Pobierz wtyczkę z SourceForge:

    http://downloads.sourceforge.net/project/npp-plugins/TextFX/TextFX%20v0.26/TextFX.v0.26.unicode.bin.zip

  2. Otwórz plik zip i wypakuj NppTextFX.dll

  3. Umieść NppTextFX.dll w katalogu wtyczek Notepad ++, takich jak:
    C: \ Program Files \ Notepad ++ \ plugins

  4. Uruchom Notepad ++, a TextFX będzie jednym z elementów menu plików (jak widać w odpowiedzi nr 1 powyżej autorstwa Colina Pickarda)

Po zainstalowaniu wtyczki TextFX postępuj zgodnie z instrukcjami w odpowiedzi nr 1, aby posortować i usunąć duplikaty.

Rozważ także skonfigurowanie skrótu klawiaturowego za pomocą opcji Ustawienia> Odwzorowanie skrótów, jeśli często używasz tego polecenia lub chcesz powielać skrót klawiaturowy, na przykład F9 w programie TextPad do sortowania.


W notatniku ++ 7.6 wtyczka powinna zostać dodana do C:\Users\<your_user>\AppData\Local\Notepad++\plugins\NppTextFX. Poza tym nadal działa dobrze.
— P_W999,

14

W wersji 7.8 możesz to zrobić bez żadnych wtyczek - Edycja -> Operacje na liniach -> Usuń kolejne zduplikowane linie. Będziesz musiał posortować plik, aby umieścić zduplikowane linie w kolejnej kolejności, zanim to zadziała, ale działa to jak urok.

Opcje sortowania są dostępne w Edycja -> Operacje liniowe -> Sortuj według ...


7

Do tego może być potrzebna wtyczka. Możesz wypróbować wiersz poleceń cc.ddl(usuń duplikaty) ConyEdit . Jest to wtyczka między edytorami do edytorów tekstu, w tym Notepad ++.

Gdy ConyEdit działa w tle, wykonaj następujące czynności:

  1. wprowadź wiersz poleceń cc.ddlna końcu tekstu.
  2. skopiuj tekst i wiersz poleceń.
  3. wklej, a zobaczysz, co chcesz.

Przykład
wprowadź opis zdjęcia tutaj


5

Wyszukaj wyrażenie regularne: \b(\w+)\b([\w\W]*)\b\1\b

Zamień na: $1$2

Naciśnij przycisk Zamień , aż w twoim pliku nie będzie już pasujących wyrażeń regularnych.


Utworzono plik testowy, aby to wypróbować, ale wyrażenie regularne nie działało niezawodnie, aby wykonać zadanie.
— RockPaperLizard

Czy możesz podać przykład, który zawodzi, abym mógł poprawić swoją odpowiedź?
— Hesham Eraqi

4

Żadne nie działało dla mnie.

Rozwiązaniem jest:

Zastąpić

^(.*)\s+(\r?\n\1\s+)+$

z

\1

Utworzono plik testowy, aby to wypróbować, ale wyrażenie regularne nie działało niezawodnie, aby wykonać zadanie.
— RockPaperLizard

Dla wszystkich moich danych zadziałało dobrze. Zapomniałem, jakie było moje rozwiązanie. Dodaj więcej szczegółów tam, gdzie się nie powiodło, aby inne osoby mogły poprawić ten wyrażenie regularne.
— Manohar Reddy Poreddy

Utworzyłem plik, aby każda linia zawierała liczbę całkowitą od 0 do 999, w losowej kolejności, czasem z duplikatami. Nie usunął większości duplikatów i nie usunął żadnych duplikatów, ponieważ nie były one sekwencyjne.
— RockPaperLizard

1
Proszę podać 2 przykłady dla pracujących i dla niedziałających. Pomoże komuś.
— Manohar Reddy Poreddy

1
dlaczego ^(.*)\s+(\r?\n\1\s+)+$nie ^(.*)\s*(\r?\n\1\s*)+$?
— Mark Ch

2

Menedżer wtyczek jest obecnie niedostępny (nie jest dostarczany z dystrybucją) dla Notepad ++. Musisz zainstalować go ręcznie ( https://github.com/bruderstein/nppPluginManager/releases ), a nawet jeśli to zrobisz, wiele wtyczek nie będzie już dostępnych (brak TextFX).

Być może istnieje inna wtyczka, która zawiera wymaganą funkcjonalność. Poza tym jedynym sposobem na to w Notepad ++ jest użycie specjalnego wyrażenia regularnego do dopasowania, a następnie zastąpienia ( Ctrl+ F→ karta Zamień ).

Chociaż w menu Edycja dostępnych jest wiele funkcji (przycinanie, usuwanie pustych wierszy, sortowanie, konwersja EOL), nie jest dostępna żadna „unikalna” operacja.

Jeśli masz Windows 10, możesz włączyć Bash (po prostu wpisz Ubuntu w Microsoft Store i postępuj zgodnie z instrukcjami w opisie, aby go zainstalować) i użyj cat your_file.txt | sort | uniq > your_file_edited.txt. Oczywiście musisz znajdować się w tym samym katalogu roboczym, co „twoj_plik.txt” lub odwoływać się do niego przez ścieżkę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.