LINUX.ORG.RU

случайная сортировка в openbsd

 , ,


0

1

Нужно в случайном порядке отсортировать строки из файла, естессно в командной строке. Гугл говорит, что есть sort -R, однако в openbsd sort видимо свой собственный, и man sort говорит, что такой ключ делает нечто совершенно другое, что конкретно мой английский понять не дал. был обнаружен random, но он просто из ввода случайным образом удаляет строки, тогда как мне надо не удаляя строки их случайно поменять местами. как это можно сделать? желательно - стандартными средствами и не слишком длинно. если нельзя - скрипт на sh берущий строки из stdin и выводящий рассортированные строки в stdout сойдет, либо что-нибудь из пакетов.


И shuf там у вас нет небось?

$ python2.7 -c 'import random,sys;a=open("111").readlines();random.shuffle(a);sys.stdout.write("".join(a))'
333
111
222
$ cat 111 
111
222
333

anonymous
()

другое, что конкретно мой английский понять не дал

Рандомизирует группы строк: одинаковые будут вместе (из 1 2 2 -> 2 1 2 не получится). Но часто это не принципиально.

anonymous
()

скрипт на sh берущий строки из stdin и выводящий рассортированные строки в stdout сойдет

По-любому нужно иметь весь, построчно тут делать нечего.
Тогда просто в лоб: по кол-ву строк (LINENUM) генерируешь набор случайных неповторяющихся чисел от 1 до LINENUM и построчно выводишь в соотв. с этим списком.

Или использовать «случайность» hash'a

input_stream | awk '{inp[i]=$0; i++}; END {for (k in inp) {print inp[k]}}'
anonymous
()
Ответ на: комментарий от anonymous

Рандомизирует группы строк: одинаковые будут вместе (из 1 2 2 -> 2 1 2 не получится). Но часто это не принципиально.

Если принципиально, то можно при помощи grep -ao '[a-z]' /dev/urandom получить случайные данные. Добавить к каждой строке случайный байт, отсортировать при помощи sort -R, а затем убрать лишний байт.

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

Лучше вместо grep использовать hexdump, через ″-n″ задать нужное число байт (по 4 байта на строку исходного файла):

hexdump -n $(( `wc -l FILE | cut -d' ' -f 1`*4 )) -e '«%u\n»' /dev/urandom | paste - FILE

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

ports.su и openports.se такого тоже не знают. да и i386, пакетов дохера. не найти пакет для такой мейнстримной архитектуры - постараться надо. разработчики вроде тоже пакеты рекомендуют.

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

rand() наверное есть, во всяком случае оно вроде прекрасно работает, спасибо. тему отмечать как решенную или есть другие варианты?

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