Usuwanie zduplikowanych wierszy w Notepad ++

595

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

UGEEN
źródło

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 ++

Colin Pickard
źródło
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.

stema
źródło
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

Grant Peters
źródło
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

blueberry0xff
źródło
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 ++.

Pablo Santa Cruz
źródło
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.

wszechstronnie
źródło
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 ...

dr.nixon
źródło
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

Donald
źródło
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.

Hesham Eraqi
źródło
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
Manohar Reddy Poreddy
źródło
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ę.

Patronaut
źródło