Получить первый из многих похожих строк - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть строки вида

A-XXX
A-YYY
B-NNN
A-ZZZ
B-MMM
C-DDD

Однако я хочу получить первое вхождение каждой строки перед дефисом.Таким образом, решение здесь будет:

A-XXX
B-NNN
C-DDD

Как я могу сделать это с помощью инструментов Bash?Я попытался uniq, но я не могу установить там «шаблон сходства».

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Это может работать для вас (GNU sed):

sed -n '1!G;/^\([^-]*-\).*\n\1/!P;h' file

Общая идея состоит в том, чтобы сравнить текущую строку со всеми предыдущими строками и, используя сопоставление с образцом, печатать только текущую строку, если ее нетсоответствует предыдущему ключу.

Первая строка всегда будет напечатана.Начиная со второй строки, предыдущие строки добавляются к текущей строке с помощью команды G, а первая или текущая строка выводятся только с помощью команды P, если нет совпадения клавиш с использованием /^\(^-]*-\).*\n\1/!команда.Текущая строка и добавленная строка (и) затем сохраняются в области удержания с помощью команды h, готовой для следующей строки.

NB Ключ определяется символами с начала строки, вплоть до персонажа -.Таким образом, регулярное выражение ^[^-]*- соответствует такому ключу.Также обратите внимание на то, что ключ собирается как группа \(...\), а позже упоминается как \1, что позволяет ссылаться на строки символов в более поздней точке того же регулярного выражения.В этом случае ключ в начале текущей строки сопоставляется с любым таким ключом в предыдущих строках.

0 голосов
/ 05 февраля 2019

Будет ли этого достаточно?

cat uwe
A-XXX
A-YYY
B-NNN
A-ZZZ
B-MMM
C-DDD
$ awk -F'-' '!a[$1]{print $0;a[$1]++}' uwe
A-XXX
B-NNN
C-DDD

РЕДАКТИРОВАТЬ:

Можно на самом деле сократить это до немного более загадочным:

$ awk -F'-' '!a[$1]++' uwe
A-XXX
B-NNN
C-DDD

Что мы делаем, чтобы сказатьawk - - разделитель полей;!a[$1] говорит awk выполнить следующие команды (при отсутствии данных print используется по умолчанию) и после увеличения массива, который проверяет, было ли замечено значение.

...