使用echo生成元素组合

时间:2014-10-03 09:26:35

标签: bash shell brace-expansion

我需要准备一个简单的脚本来生成存储在变量中的一组元素的所有排列,这些元素包含n个元素的组(可以参数化n),想到的最简单的解决方案是使用几个循环,具体取决于选定的小组长度。但我认为利用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)

我坚持下去,我很感激任何提示或帮助。

2 个答案:

答案 0 :(得分:2)

如果您需要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}" <<< "$@" | sed 's/ $//'
done

示例:

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

空集也在那里,相信我。

答案 1 :(得分: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