Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: grep убрать дубликаты  (Прочитано 22952 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Bocha

  • Автор темы
  • Участник
  • *
  • Сообщений: 139
    • Просмотр профиля
grep убрать дубликаты
« : 12 Декабря 2009, 14:34:45 »
как убрать дубликаты в grep?
задача who | grep user что бы вывалились только уникальные записи и не было в списке дубликатов.. как сделать?

Пользователь решил продолжить мысль 12 Декабря 2009, 19:11:02:
неужели никто не подскажет?

вывод грепа например:
vasya
vasya
dima
natasha
petr
petr
gena
kolya
gena
petr


нужно получить список уникальных:
vasya
dima
natasha
petr
gena
kolya
« Последнее редактирование: 12 Декабря 2009, 19:11:02 от Bocha »

Оффлайн lanuel

  • Новичок
  • *
  • Сообщений: 9
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #1 : 13 Декабря 2009, 23:06:53 »
man uniq

Оффлайн Sam Stone

  • Старожил
  • *
  • Сообщений: 1131
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #2 : 14 Декабря 2009, 16:56:12 »
who | grep | sort | uniq
Jellyfish 6.5.0-45-generic
2690v4 64Gb

Оффлайн Bocha

  • Автор темы
  • Участник
  • *
  • Сообщений: 139
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #3 : 15 Декабря 2009, 05:12:35 »
Спасибо огромное!!!
to lanuel: Я просто не знал что есть такая команда...

Пользователь решил продолжить мысль 15 Декабря 2009, 04:34:02:
Поскольку who возвращает не просто имя пользователя но и данные сессии то uniq не работает, пришлось сделать так:
for uname in `who | grep u0 | awk '{print $1}' | sort | uniq`
do
   echo $uname@mydomain.ru";"
done

Но формируется список строк,
u001@mydomain.ru;
u002@mydomain.ru;
u003@mydomain.ru;
u004@mydomain.ru;

а мне нужно получить строку:
u001@mydomain.ru;u002@mydomain.ru;u003@mydomain.ru;u004@mydomain.ru;
Как теперь убрать перевод на новую строку?

Думаю вы поняли для чего мне это все ))), нужно сделать скрипт email рассылки пользователям с открытыми сессиями.
« Последнее редактирование: 15 Декабря 2009, 06:40:56 от Bocha »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #4 : 15 Декабря 2009, 09:09:47 »
Чтобы убрать переводы строк читайте построчно из файла, а затем пишите без перевода строки.
echo -n поможет.
Сходу не найти, но где-то у меня это было уже сделано. Легче сделать, чем найти. Будет посвободнее, нарисую скрипт, если не помогут.
PS. Если поискать, наверняка, есть утилиты, убирающие enter в многострочном тексте. Например, для уплотнения xml такие вещи используются вовсю.

Держите.
#! /bin/sh
# удаление Enter в файле
# результат во входном файле
# запуск:
# ./clearEnter file
rm ./clearEnter.tmp 2> /dev/null
while read LINE
do
   echo -n "$LINE" >> ./clearEnter.tmp
done <$1
cp ./clearEnter.tmp $1 2> /dev/null
rm ./clearEnter.tmp 2> /dev/null
« Последнее редактирование: 15 Декабря 2009, 15:31:57 от alexander.pronin »

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #5 : 15 Декабря 2009, 17:02:00 »
alexander.pronin, можно немного попроще реализовать:

#!/bin/bash
[ -z $1 ] && echo -e "Utility to clear newline character from file.\nUsage: $0 regular_file." && exit 1
tmp=$(mktemp)
tr -d '\n' < "$1" > "$tmp" && mv -f "$tmp" "$1"

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #6 : 16 Декабря 2009, 08:27:33 »
Я в лоб.
Спасибо буду знать.
tr     Ооооооооооооооо!
Мне Ваше кунфу нравится.
« Последнее редактирование: 16 Декабря 2009, 08:35:44 от alexander.pronin »

Оффлайн Bocha

  • Автор темы
  • Участник
  • *
  • Сообщений: 139
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #7 : 21 Декабря 2009, 15:48:45 »
О! tr -d это отлично! Спасибо!!!
У меня все первратилось в:
for uname in `who | grep u0 | awk '{print $1}' | sort | uniq`
do
   echo $uname@mydomain.ru";" | tr -d '\n'
done

возвращает как надо:
u001@mydomain.ru;u002@mydomain.ru;u003@mydomain.ru;u004@mydomain.ru;

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #8 : 21 Декабря 2009, 16:08:38 »
А так не проще ли? ;)
echo -n "$uname@mydomain.ru;"

Пользователь решил продолжить мысль 21 Декабря 2009, 14:11:20:
Или вообще так:
who | grep u0 | awk '{print $1}' | sort | uniq | awk '{printf $1"@mydomain.ru"}' :coolsmiley:
« Последнее редактирование: 21 Декабря 2009, 16:13:48 от Mam(O)n »

Оффлайн Bocha

  • Автор темы
  • Участник
  • *
  • Сообщений: 139
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #9 : 21 Декабря 2009, 16:12:54 »
 :-[ вот я ламерюга... я не знал об этом.
echo -n дает такой же результат!
спасибо что вразумили  :)

Пользователь решил продолжить мысль 21 Декабря 2009, 14:15:10:
Мне стало еще грустнее  :-[..

Тогда  что бы перевод строки убрать будет так:
who | grep u0 | awk '{print $1}' | sort | uniq | awk '{print $1"@mydomain.ru,"}'| tr -d '\n'
« Последнее редактирование: 21 Декабря 2009, 18:53:46 от Bocha »

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #10 : 21 Декабря 2009, 16:31:44 »
Не переживайте. Кунфу можно всю жизнь шлифовать. ;D

Оффлайн Mam(O)n

  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
Re: grep убрать дубликаты
« Ответ #11 : 21 Декабря 2009, 19:33:52 »
who | grep u0 | awk '{print $1}' | sort | uniq | awk '{print $1"@mydomain.ru,"}'| tr -d '\n'
Чтоб без tr (без переводов) нужно в awk заюзать printf

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.