Видалити рядок, якщо наступний рядок такий же


15

Яку команду sed / awk можна використовувати? Просто sort -uвидалять усі екземпляри

Вхід:

abc
abc
def
abc
abc
def

Очікуваний вихід:

abc
def
abc
def

Відповіді:


36

Ось для чого uniqстандартна команда.

uniq your-file

Зауважте, що деякі uniqреалізації, такі як GNU uniq, дадуть вам першу з послідовностей рядків, які сортують однакові (де strcoll()повертається 0), на відміну від байт-байта однакові (де memcmp()або strcmp()повертає 0). Щоб примусити байт до порівняння байтів незалежно від uniqреалізації, ви можете примусити локаль до C:

LC_ALL=C uniq your-file

7

Vim може цього добре досягти:

:g/\v^(.*\n)\1/d

Або якщо ви бажаєте використовувати vim як інструмент командного рядка, ви можете це зробити як

vim file -c "g/\v^(.*\n)\1/d" -c "wq"

Таким чином, вам не доведеться боротися з виходом із vim пізніше;)

Пояснення:

:g/

На всіх рядках, які відповідають цьому регулярному вибору ...

\v^(.*\n)\1

Будь-яка лінія слідує за собою ...

/d

запустіть команду d elete (видаліть поточний рядок). Потрібно -c "wq"зберегти зміни та вийти.


Зауважте, що з vim 8.1.2112 принаймні, він не працює для дублюваних рядків, які є останніми двома рядками файлу. Крім того, він видаляє лише один дублікат із послідовностей 3-х повторних рядків.
Стефан Шазелас

1
@ StéphaneChazelas, за винятком того, що в даний час нам не вистачає специфікацій для бажаної поведінки у 3-рядковому випадку - я бачив бажану поведінку обома способами.
D. Ben Knoble
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.