2014-10-03 89 views
3

我需要準備一個簡單的腳本來生成一組元素中存儲在變量中的一組元素(可n參數化)中的一組元素的可能排列,最簡單的解決方案是想到的是根據所選組的長度使用幾個循環。但我認爲,這將是更優雅服用echo命令來產生組合的能力優勢,那就是用echo生成元素的組合

echo {1,2}{1,2} 
    11 12 21 22 

所以使用這種方法,我想實現這樣做的一般方法,如使用輸入參數的元素列表(例如{1,2})和元素的數量。它會是這樣的:

set={1,2,3,4} 
group=3 
for ((i=0; i<$group; i++)); 
do 
    repetition=$set$repetition 
done 

因此,在這種特殊情況下,在循環結束時,重複變量的值爲{1,2,3,4} {1,2,3,4} {1,2,3,4}。但是我無法找到使用這個變量來使用echo命令產生組合的方法。我已經嘗試了幾件事情,例如:

echo $repetition 
echo $(echo $repetition) 

我被困住了,我會很感激任何提示或幫助。

+0

對於你的任務,元素的順序似乎很重要。因此,您正在尋找一種算法來枚舉輸入的所有*排列*。實際上尋找產生*組合的算法的人將被這個問題誤導。 – josch 2017-09-01 10:46:49

+0

謝謝Josch,你是對的,我已經根據你的建議cha動了這個問題,使之更加清晰。 – Toni 2017-09-07 08:07:22

回答

1

您可以使用:

bash -c "echo "$repetition"" 
111 112 113 114 121 122 123 124 131 132 133 134 141 142 143 144 211 212 213 214 221 222 223 224 231 232 233 234 241 242 243 244 311 312 313 314 321 322 323 324 331 332 333 334 341 342 343 344 411 412 413 414 421 422 423 424 431 432 433 434 441 442 443 444 

或者使用eval代替bash -c

0

如果需要k-combinations for all k,這樣的組合腳本可以幫助:

#!/bin/bash 

POWER=$((2**$#)) 
BITS=`seq -f '0' -s '' 1 $#` 

while [ $POWER -gt 1 ];do 
    POWER=$(($POWER-1)) 
    BIN=`bc <<< "obase=2; $POWER"` 
    MASK=`echo $BITS | sed -e "s/0\{${#BIN}\}$/$BIN/" | grep -o .` 
    POS=1; AWK=`for M in $MASK;do 
    [ $M -eq 1 ] && echo -n "print \\$\${POS};" 
    POS=$(($POS+1)) 
    done;echo` 
    awk -v ORS=" " "{$AWK}" <<< "[email protected]" | sed 's/ $//' 
done 

例子:

./combination ⚪ ⛔ ⚫ 
⚪ ⛔ ⚫ 
⚪ ⛔ 
⚪ ⚫ 
⚪ 
⛔ ⚫ 
⛔ 
⚫ 

空集也存在,相信我。

+0

如果你的'seq'在格式上很挑剔,請用'BITS = \'eval echo {1 .. $#} |替換它。 sed -E's/[0-9] + [] */0/g''' – 2016-09-24 16:16:53