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

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
tull
ефрейтор
Сообщения: 51
Зарегистрирован: 2008-02-23 19:02:38

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

Непрочитанное сообщение tull » 2011-10-03 18:54:37

есть список, надо получить из него несколько случайных строк.
раньше использовал gsort -R | head -n
переехал на новый сервер (была freebsd 7.2, стала 8.1), и gsort почему-то нет, в т.ч. в портах.
мне подойдет любое решение, которое позволяет выдергивать заданное кол-во случайных строк.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

FiL
ст. лейтенант
Сообщения: 1375
Зарегистрирован: 2010-02-05 0:21:40

Re: как выбрать несколько случайных строк из списка?

Непрочитанное сообщение FiL » 2011-10-03 19:17:28

в bash'e есть $RANDOM.

Код: Выделить всё

N=`cat $FILE |wc -l`
num=5
for ((i=1; i<=$num; i++))
do
 R=$(($RANDOM % $N))
 echo $R
 head -n $R $FILE |tail -1
done

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: как выбрать несколько случайных строк из списка?

Непрочитанное сообщение kpp » 2011-10-04 10:07:11

Во Фре есть замечательная утилита jot. Кроме всего прочего, умеет генерировать случайные(конечно псевдослучайные) числа в заданном диапазоне.
Пример получения двух случайных номеров строк из файла:

Код: Выделить всё

#!/bin/sh
#
# 2011-02-17 17:34:18
# Description
# version 1
#

# получить кол-во строк в файле
STR_NUM=`wc -l $1 | awk '{print $1}'`
# получить первый случайный номер строки
NUM1=$(jot -r 1 1 $STR_NUM)
# получить второй случайный номер строки
NUM2=$(jot -r 1 1 $STR_NUM)
# для гарантирования того, что получили разные номера
while [ "$NUM1" -eq "$NUM2" ]
do
 NUM2=$(jot -r 1 1 $STR_NUM)
done
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

tull
ефрейтор
Сообщения: 51
Зарегистрирован: 2008-02-23 19:02:38

Re: как выбрать несколько случайных строк из списка?

Непрочитанное сообщение tull » 2011-10-04 18:35:11

Спасибо за советы!
А чего вообще с этим gsort произошло, почему он исчез?

Вообще на самом деле моя задача - удалять несколько случайных записей из таблицы pf. Раньше делалось так:
/sbin/pfctl -t table -Ts | /usr/local/bin/gsort -R | head -n 5 | /sbin/pfctl -t table -T del -f -
В принципе меня устроит и вариант удаления не случайных, а просто несколько ip, которые были добавлены раньше всего.

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: как выбрать несколько случайных строк из списка?

Непрочитанное сообщение kpp » 2011-10-05 9:40:19

А что такого особенного есть в gsort, чего нет в обычном sort ?
Может обычного, стандартного sort хватит?
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

tull
ефрейтор
Сообщения: 51
Зарегистрирован: 2008-02-23 19:02:38

Re: как выбрать несколько случайных строк из списка?

Непрочитанное сообщение tull » 2011-10-05 14:28:39

kpp писал(а):А что такого особенного есть в gsort, чего нет в обычном sort ?
Может обычного, стандартного sort хватит?
sort не умеет сортировать в случайном порядке, а gsort умеет (ключ -R)

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: как выбрать несколько случайных строк из списка?

Непрочитанное сообщение kpp » 2011-10-05 17:34:59

Гм.. Но это уже не сортировка, а "перепутывание". ;)
Можно стандартному sort задавать разные параметры сортировки :-D
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

tull
ефрейтор
Сообщения: 51
Зарегистрирован: 2008-02-23 19:02:38

Re: как выбрать несколько случайных строк из списка?

Непрочитанное сообщение tull » 2011-10-05 22:06:27

kpp писал(а):Гм.. Но это уже не сортировка, а "перепутывание". ;)
Ну, типа того.
В конечном итоге все, что мне нужно - случайным образом удалять записи из таблицы pf.