Вам может не потребоваться использование внешних инструментов, таких как sort
, параметры и использование которых могут различаться в зависимости от вашей операционной системы. Bash имеет внутренний генератор случайных чисел, доступный через переменную $RANDOM
. Обычная практика - заполнять генератор, устанавливая переменную, например так:
RANDOM=$$
или
RANDOM=$(date '+%s')
и т.д.. Но, конечно, вы также можете использовать предсказуемое начальное число, чтобы получить предсказуемые неслучайные результаты:
$ RANDOM=12345; echo $RANDOM
28207
$ RANDOM=12345; echo $RANDOM
28207
Чтобы переупорядочить строки отображаемого файла случайным образом, вы можете прочитать файл в массив, используя mapfile:
$ mapfile -t a < source.txt
Затем просто переписать индексы массива:
$ for i in ${!a[@]}; do a[$((RANDOM+${#a[@]}))]="${a[$i]}"; unset a[$i]; done
При чтении неассоциативного массива bash естественным образом упорядочивает элементы в порядке возрастания значения индекса.
Обратите внимание, что в индекс new для каждой строки добавлено количество элементов массива, чтобы избежать коллизий в этом диапазоне. Это решение все еще подвержено ошибкам - нет гарантии, что $RANDOM
выдаст уникальные числа. Вы можете уменьшить этот риск с помощью дополнительного кода, который проверяет предыдущее использование каждого индекса, или уменьшить риск с помощью сдвига битов:
... a[$(( (RANDOM<<15)+RANDOM+${#a[@]} ))]= ...
Это превращает ваши значения индекса в 30-битное целое число без знака вместо 15-битного целое число без знака.