【问题标题】:Generate combinations of elements with echo生成带有回声的元素组合
【发布时间】:2014-10-03 09:26:34
【问题描述】:

我需要准备一个简单的脚本来生成存储在变量中的一组元素的所有可能排列,这些元素以 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)

我被困住了,如果有任何提示或帮助,我将不胜感激。

【问题讨论】:

  • 对于您的任务,元素的顺序似乎很重要。因此,您正在寻找一种算法来枚举输入的所有 排列。真正在寻找生成组合的算法的人会被这个问题误导。
  • 谢谢 Josch,你是对的,我已经根据你的建议对问题进行了修改,以使其更清晰。

标签: bash shell brace-expansion


【解决方案1】:

如果你需要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 ⚪ ⛔ ⚫
⚪ ⛔ ⚫
⚪ ⛔
⚪ ⚫
⚪
⛔ ⚫
⛔
⚫

空集也在那里,相信我。

【讨论】:

  • 如果您的seq 对格式很挑剔,请将其替换为BITS=`eval echo {1..$#} | sed -E 's/[0-9]+[ ]*/0/g'`
【解决方案2】:

你可以使用:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2021-12-06
    • 2022-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多