2014-10-03 44 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