Как рандомизировать список и перебирать рандомизированный список (bash) - PullRequest
2 голосов
/ 12 октября 2011

Я написал небольшой скрипт bash, который читает команды (по одной на строку) в текстовом файле.На данный момент сценарий (показанный ниже) выполняет команды в последовательном порядке (т.е. в том же порядке, который указан в файле).

Я хотел бы помочь изменить приведенный ниже сценарий, чтобы ончитает команды в массив, затем рандомизирует этот массив (т. е. список) перед итерацией по рандомизированному списку.

Это то, что у меня есть:

while read -r -a array
do
   python make_move.py "${array[@]}"
done < game_commands.dat

Я использую bash 4.1.5 в Ubuntu 10.0.4 LTS

[[Edit]]

Мне нужно выполнить ВСЕ команды в списке, причем каждая команда выполняется ТОЛЬКО ОДИН РАЗ.

Ответы [ 3 ]

4 голосов
/ 12 октября 2011

Вы можете перетасовать строки файла, используя команду shuf.

Редактировать : Ваш код с использованием shuf будет выглядеть

while read -r -a array
do
    python make_move.py "${array[@]}"
done < <(shuf game_commands.dat)
1 голос
/ 12 октября 2011

Если вам нужно выполнить что-то подобное в системе, где shuf недоступен, (только bash 4 , легко адаптируется для большинства современных оболочек):

unset max s i
readarray -t _cmd < game_commands.dat
while (( max < ${#_cmd[@]} )); do
  (( i = RANDOM % ${#_cmd[@]} ))
  [[ $s == *,$i,*  ]] || {
     python make_move.py "${_cmd[i]}"
         (( max++ ))
        }
  s+=,$i,
done
1 голос
/ 12 октября 2011

Попробуйте sort -R.Это будет случайным образом перемешивать линии. РЕДАКТИРОВАТЬ: Но одни и те же строки всегда будут появляться в блоках ...

...