LINUX.ORG.RU

uniq : Сортировка только по одной части строки.

 ,


0

1

Добрый день, возник следующий вопрос.

Грепнул файл, получаю несколько строк . В этих строках меня интерисует значение почтового адресса, указанного как (прим):dest=newby@gmail.com, данный параметр всегда идет 9 в строчке. Можно было бы воспользоваться параметром -f, и начать проверку на уникальные значения уже с этого поля, но после него так же следуют другие поля, по которым строчки с одинаковыми почтами идентифицируются как разные.

Есть ли параметр для утилиты uniq, по которому я могу сделать проверку строк только по одной ее части? Если нет, подскажите, пожалуйста, как это сделать.

З.Ы. Пробовал так: Достал чисто значения почт через awk,на выводе получил строчки типа: dest=newby1@gmail.com dest=newby2@gmail.com но после того как к команед добавл uniq ничего не произошло, почты так и повторялись. выглядила она так: grep ‘param’ file1.txt | awk ‘{param $9}’ | uniq -s 5

Мда. Ты научись мысли формулировать. Ничего не понятно, что ты хочешь. А если не умеешь - делай тупо. Выкладывай исходник, выкладывай точное «как надо». uniq это вообще не о сортировке.

anonymous
()

Я, тоже, ничего не понял.

urxvt ★★★★★
()

Что-то в стиле:

awk '{if(!seen[$3]) {print; seen[$3] = 1}}'

Или с помощью sort -u -k.

xaizek ★★★★★
()

но после того как к команед добавл uniq ничего не произошло, почты так и повторялись

uniq без sort не работает, нужен sort -u

gedisdone ★★★
()
Ответ на: комментарий от anonymous

В процессе отправки системой сообщения на почту, происходит ошибка, о чем имееются соответствующие записи в логах. К примеру, запись имеет вид:

13:04 ERROR - delivery error [source=abc,dest=newby@gmail.com, counter=1, Time = 90]

Сообщение пытаетя отправиться не единожды, поэтому по одному и тому-же dest=newby@gmail.com записей может быть много. Да и Time может быть разным.

13:04 ERROR - delivery error [source=abc,dest=newby1@gmail.com, counter=1, Time = 90]

13:05 ERROR - delivery error [source=abc,dest=newby2@gmail.com, counter=1, Time =84]

16:04 ERROR - delivery error [source=abc,dest=newby1@gmail.com, counter=2, Time = 96]

Мне необходимо узнать, сколько уникальных dest= словили данную ошибку.

Каким образом я могу получить вывод строк тольо с уникальными и неповторяющимися dest?

Boniv413
() автор топика
Ответ на: комментарий от Boniv413

Я это в свое время решал костылем вида «вытащить интересующее поле вперед, отсортировать, убрать поле». В твоем случае нечто вроде cat $file | awk -F"," '{print $2,$0}' |sort | cut -d' ' -f2-

Возможно, есть менее кривой способ.

suspend
()
Последнее исправление: suspend (всего исправлений: 2)
Ответ на: комментарий от Boniv413

И в чем проблема, сначала грепаешь по ошибке, потом сортируешь и удаляешь дубликаты по почте, получаешь свой список уников по почте.

anonymous
()
Ответ на: комментарий от Boniv413

Вытащить в строке регулярным выражением по dest=..., значение адреса электронной почты, прибавить в массиве (в хэш-таблице, если точнее) единичку по адресу, равному адресу электронной почты, и в конце пройтись по всему массиву и проверить значения элементов. Если оно равно 1, вывести в вывод.

На awk такое решается просто.

gedisdone ★★★
()
awk -F, '!x[$2]++' лог-файл
anonymous
()
Ответ на: комментарий от anonymous

Чушь какую то написал. Читай ман внимательно.

Если читать внимательно, выясниться, что uniq - это не uniq, а некий фильтр (объединятель, группирователь) совпадающих соседей, и вообще никакой уникальностью не пахнет, если не подать правильно подготовленные данные, а именно предварительно отсортированные.

anonymous
()
Ответ на: комментарий от anonymous

И от команды ″cat″ кошатиной не пахнет. Не надо из названия команды делать вывод о её функции.

uniq - report or omit repeated lines

mky ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.