2011-10-12 66 views
2

我已经写了一个小bash脚本读取命令(每行一个)迭代,在文本文件中。 目前,脚本(如下所示)正在按顺序执行命令(即以与文件中输入的顺序相同的顺序)。如何随机列表,并通过随机列表(庆典)

我想帮助修改下面的脚本,以便它读取命令到一个数组,然后随机化迭代虽然随机列表之前该阵列(即列表)。

这是我到目前为止有:

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

我在Ubuntu LTS 10.0.4运行bash 4.1.5

[编辑]

我需要执行列表中的所有命令,每个命令仅执行一次。

+0

这是一个常见问题;见http://mywiki.wooledge.org/BashFAQ/026以及例如http://stackoverflow.com/questions/886237/how-can-i-randomize-the-lines-in-a-file-using-a-standard-tools-on-redhat-linux – tripleee

+0

@tripleee:到底它是您提供解决方案的发布链接中的shuffle命令。你想发布这个答案,以便我可以接受吗? –

+0

'$ array'实际上不是一个数组。循环遍历'shuf'输出的行(如在Sven的答案中)。无论如何,效果将按照要求,但第一行应该是:'while read -r line',第三行应该是'python make_move.py“$ line”'。如果你真的需要数组中的行,你仍然可以这样做,但是你的Python脚本可能无法正确处理它。 –

回答

4

可以使用shuf命令洗牌文件的行。

编辑:使用shuf您的代码看起来

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

+1,这是最合适的。 –

+0

如何在脚本中使用** shuf **?我的第一次尝试是这样的:a = shuf $ cmds其中_cmds_是从文件读取的数组,并且出现错误:“GET_SWORD:command not found”。 GET_SWORD恰好是命令数组中的第一个命令。所以基本上,我想洗牌一个数组,然后得到一个新的混洗数组,然后我可以迭代。 –

+0

@HomunculusReticulli:增加了完整的代码。 –

1

尝试sort -R。这将随机洗牌。 编辑:但是,同样的线路将始终出现在块......

+0

这不会洗牌所有的行,它会按随机散列排序。这意味着相同的线条总是以块的形式出现。 –

+0

@Sven,你是对的,谢谢。 – TMS

1

如果你需要一个系统,SHUF不可用, (庆典4只,很容易适应上执行这样的事情对于大多数现代的shell):

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

删除自己的答案将提高您的声誉... – tripleee

+0

@tripleee,谢谢!转换为shell代码。 –