Jak mogę usunąć zduplikowane wiersze w programie Visual Studio Code?

118

Powiedzmy, że masz następujący tekst:

abc
123
abc
456
789
abc
abc

Chcę usunąć wszystkie wiersze „abc” i po prostu zachować jedną. Nie mam nic przeciwko sortowaniu. Wynik powinien wyglądać następująco:

abc
123
456
789
Younes
źródło

Odpowiedzi:

224

Jeśli kolejność wierszy nie jest ważna

Sortuj wiersze alfabetycznie, jeśli jeszcze nie są, i wykonaj następujące kroki:
(na podstawie tego pokrewnego pytania: Jak znaleźć i usunąć zduplikowane wiersze z pliku za pomocą wyrażeń regularnych? )

  1. Control+F

  2. Przełącz „tryb zastępowania”

  3. Przełącz „Użyj wyrażenia regularnego” (ikona z .*symbolem)

  4. W polu wyszukiwania wpisz^(.*)(\n\1)+$

  5. W polu „ zamień na ” wpisz$1

  6. Kliknij przycisk Zamień wszystko(„Zamień wszystko”).

Jeśli kolejność wierszy jest ważna, więc nie możesz sortować

W takim przypadku skorzystaj z rozwiązania innego niż VS Code (patrz tutaj ) lub - jeśli twój dokument nie jest bardzo duży i nie masz nic przeciwko spamowaniu przycisku Zamień wszystko - wykonaj poprzednie kroki, ale w krokach 4 i 5, wprowadź te:
(na podstawie opcji Usuń określone zduplikowane linie bez sortowania )

Uwaga: blokuje pliki ze zbyt dużą liczbą wierszy (1000+); może spowodować awarię VS Code; może w niektórych przypadkach wprowadzić puste wiersze.

  • szukaj :((^[^\S$]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\n)?

  • zastąpić :$1

a następnie kliknij przycisk „Zamień wszystko” tyle razy, ile wystąpi duplikat .

Dowiesz się, że wystarczy, gdy liczba linii przestanie maleć po kliknięciu przycisku. Przejdź do ostatniego wiersza dokumentu, aby mieć na to oko.

Marc.2377
źródło
4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?spowodował awarię mojego vscode ... Zrobiłem Find in one file 229 lines. :(
Hickory420
@ Hickory420 Przetestowałem na mojej maszynie z 1000 linii (20 znaków długości, losowo) i nie wystąpiła awaria, ale rzeczywiście wątek blokuje się przy 100% obciążeniu procesora przez kilka sekund przy każdym przejściu. Tak, jest to mało praktyczne w przypadku dużych plików.
Marc 2377
Dzięki za to. Czy możesz wyjaśnić wyrażenie regularne ^(.*)(\n\1)+$. Po usunięciu zduplikowanych wierszy chcę spojrzeć na wszystkie wiersze ze zduplikowaną pierwszą kolumną w csv i zmienić wyrażenie regularne.
Urvah Shabbir
1
Wow, czuję, że jestem całkiem niezły w regexie i to wciąż mnie zaskakuje, świetna odpowiedź !!
electrovir
@UrvahShabbir, wyjaśnienie tego fragmentu wyrażenia regularnego znajduje się w połączonym pytaniu i odpowiedzi . Moja różni się tylko tym, że część \r?z drugiej odpowiedzi nie jest naprawdę konieczna.
Marc 2377
66

Oto bardzo ciekawe rozszerzenie: Transformer

Cechy:

  • Unikalne linie
  • Unikalne linie jako nowy dokument
  • Filtruj linie
  • Filtruj wiersze jako nowy dokument
  • Sortuj linie
  • Sortuj linie według długości
  • Wyrównaj do kursora
  • Wyrównaj CSV
  • Kompaktowy CSV
  • Kopiuj do nowego dokumentu
  • Wybierz linie
  • Linie jako JSON
  • Linie przycinania
  • Policz zduplikowane wiersze jako nowy dokument
  • Makra

Aby usunąć zduplikowane linie:

  • Usuwa zduplikowane wiersze z dokumentu

  • Działa na zaznaczeniu lub bieżącym bloku, jeśli brak wyboru

Nie bawiłem się nim zbyt wiele poza poleceniem „Unikalne linie”, ale wydaje się całkiem niezłe (włączając w to próbę zarejestrowania makr!).

znak
źródło
26

Aby dodać do odpowiedzi @ Marc.2377.

Jeśli kolejność jest ważna i nie obchodzi Cię, że po prostu zachowujesz ostatni ze zduplikowanych wierszy, po prostu wyszukaj następujące wyrażenie regularne, jeśli chcesz usunąć tylko zduplikowane niepuste wiersze

^(.+\n)(?=(?:.*\n)*?\1)

Jeśli chcesz również usunąć zduplikowane puste wiersze, użyj *zamiast+

^(.*\n)(?=(?:.*\n)*?\1)

i zamień na nic.

Zrzut ekranu wypełnionego pola wyszukiwania i zamiany

To zajmie linię i spróbuje znaleźć więcej (może 0) linii, po których nastąpi dokładnie ta sama wybrana linia. Usunie wybraną linię.

To jest tylko jednorazowe wyrażenie regularne. Nie musisz spamować przycisku zamień.

Skeeve
źródło
Ładnie zwięzłe
angus l
4
Miły. Polecam ^(.+\n)(?=(?:.*\n)*?\1)zamiast tego, ponieważ twoje wyrażenie regularne usunęło pusty wiersz tam, gdzie nie było oczekiwane. Mimo to głosowano za.
Marc 2377,
Dobry chwyt… OTOH: zduplikowane puste wiersze też są duplikatami;)
Skeeve
1
@Skeeve No dalej, to tylko małe dzięki za pomocną odpowiedź i wszystko dla lepszej społeczności :)
Zaman
1
xxx(?=…)to lookahead-match. Dlatego zapewnia, że ​​wszystko, co następuje po „xxx”, pasuje do „…”, ale nie przyspiesza wyszukiwania. (?:…)jest tylko nawiasem, który nie liczy się w liczbie nawiasów. .*\njest wzorcem dla (prawdopodobnie pustej) linii. *oznacza, że ​​może być kilka linii, a nawet żadna. Te ?po gwiazdką ( *) oznacza, że chcemy jak kilka linii, jak to możliwe. Jak \1następuje w tym wyrażeniu, efekt jest taki, że patrzymy w przyszłość na wszystkie wiersze, które nie pasują, \1dopóki nie znajdziemy pasującej linii \1. Mam nadzieję, że to wyjaśnia.
Skeeve
22

Właśnie miałem ten sam problem i znalazłem pakiet Visual Studio Code „Sort lines”. Aby uzyskać szczegółowe informacje (np. Linie sortowania ), zobacz rynek Visual Studio Code .

Ten pakiet ma opcję "Sorting lines (unique)", która zrobiła to za mnie. Uważaj na spacje na początku / końcu linii. Wpływają na to, czy linie są uważane za wyjątkowe, czy nie.

SimonAx
źródło
marketplace.visualstudio.com/… również powinien działać.
kcpr
1
Wygląda na to, że rozszerzenie nie ma już możliwości usuwania zduplikowanych wpisów. Wydaje się, że połączenie tego z odpowiedzią @ Marc-2377 załatwia sprawę .
Dan Atkinson
12

Zainstaluj rozszerzenie DupChecker , naciśnij F1i wpisz „Sprawdź duplikaty”.

Sprawdza duplikaty i zapyta, czy chcesz je usunąć.

perfecto25
źródło
11

Spróbuj znaleźć i zamienić na wyrażenie regularne .

  • Odnaleźć: ^(.+)((?:\r?\n.*)*)(?:\r?\n\1)$

  • Zastąpić: $1$2

W pierwszej grupie można wprowadzić pewną wariancję.

Lavock
źródło
-3

Właściwie nie w Visual Studio Code, ale jeśli działa, to działa.

  1. Otwórz nowy arkusz kalkulacyjny Excel
  2. Wklej dane do kolumny
  3. Przejdź do zakładki Dane
  4. Wybierz kolumnę danych (jeśli jeszcze tego nie zrobiłeś)
  5. Kliknij opcję Usuń duplikaty (nieco na środku paska)
  6. Kliknij, OKaby usunąć duplikaty.

To nie jest najlepsza odpowiedź, tak jak określiłeś Visual Studio Code, ale tak jak powiedziałem: jeśli działa, to działa :)

NostraDavid
źródło
Możesz uczynić to bardziej stosownym, udostępniając skrypt, który można wywołać bezpośrednio z Visual Studio Code. Innymi słowy, automatyzuje ten proces. Nie wiem, czy to możliwe, ale skrypt, który wywołałby program Excel za pośrednictwem jego udostępnionych interfejsów COM. To uczyniłoby tę odpowiedź znacznie bardziej wartościową, ponieważ byłby przykładem wykorzystania innych aplikacji do robienia fajnych rzeczy.
Peter Mortensen