Это может работать для вас (GNU sed):
sed -n '1!G;/^\([^-]*-\).*\n\1/!P;h' file
Общая идея состоит в том, чтобы сравнить текущую строку со всеми предыдущими строками и, используя сопоставление с образцом, печатать только текущую строку, если ее нетсоответствует предыдущему ключу.
Первая строка всегда будет напечатана.Начиная со второй строки, предыдущие строки добавляются к текущей строке с помощью команды G
, а первая или текущая строка выводятся только с помощью команды P
, если нет совпадения клавиш с использованием /^\(^-]*-\).*\n\1/!
команда.Текущая строка и добавленная строка (и) затем сохраняются в области удержания с помощью команды h
, готовой для следующей строки.
NB Ключ определяется символами с начала строки, вплоть до персонажа -
.Таким образом, регулярное выражение ^[^-]*-
соответствует такому ключу.Также обратите внимание на то, что ключ собирается как группа \(...\)
, а позже упоминается как \1
, что позволяет ссылаться на строки символов в более поздней точке того же регулярного выражения.В этом случае ключ в начале текущей строки сопоставляется с любым таким ключом в предыдущих строках.