Извлекайте уникальные линии по шаблону

хотите задать вопрос о регулярном выражении bash. Мне нужно распечатать уникальные строки из списка. Этот список содержит электронные письма, некоторые из которых повторяются много раз, а также некоторые из них имеют одинаковый идентификатор и пароль, но разные учетные записи электронной почты.

Список выглядит следующим образом:

firstman@gmail.com:pass1234
someguy@yahoo.com:onepass789
secondman@gmail.com:looksPass
firstman@yahoo.com:pass1234
thirdman@cox.net:mypas345
someguy@mail.com:onepass789

firstman@someguy@ повторился 2 раза, но с другими почтовыми провайдерами.

Мне нужно получить следующий результат:

firstman@gmail.com:pass1234
someguy@yahoo.com:onepass789
secondman@gmail.com:looksPass
thirdman@cox.net:mypas345

uniq -u выполняет эту работу только частично - он сравнивает всю строку, вместо этого мне нужно сравнивать строки вне шаблона @emailprovider:.

Как «отбросить» этот узор при извлечении уникальных линий?

1
0
116
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы перевернете поля, вы можете использовать --skip-fields=1 (или -f 1) только для учета уникальности электронных писем.

Вместо этого вы можете использовать следующую команду awk:

awk -F@ '!s[$1]{s[$1]=1;print}' filename

Получил тот же результат, что и решение от @tshiono.

Katrin Izengard 27.10.2018 04:03
Ответ принят как подходящий

С помощью AWK вы можете сказать:

awk -F'[@:]' '!seen[$1,$3]++' inputlist

дает:

firstman@gmail.com:pass1234
someguy@yahoo.com:onepass789
secondman@gmail.com:looksPass
thirdman@cox.net:mypas345
  • -F'[@:]' устанавливает разделитель полей на «@» или «:».
  • Тогда $1 содержит строку перед «@», а $3 - после «:».
  • Условие '!seen[$1,$3]++' указывает AWK напечатать строку, если запись $1,$3 не видна.

Он работает, как ожидалось. И я принял ваш ответ, потому что у меня явно есть синтаксис awk, спасибо за подробное объяснение!

Katrin Izengard 27.10.2018 04:00

Другие вопросы по теме