2011-10-12 67 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代碼。 –