Удалить строку, если следующая строка такая же

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 строками - я мог видеть желаемое поведение в обоих направлениях.
Д. Бен Нобл