Генерация комбинаций элементов с эхом
Мне нужно подготовить простой сценарий для генерации всех возможных перестановок набора элементов, хранящихся в переменной, в группах из 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 ответа
Ты можешь использовать:
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
Если вам нужны k-комбинации для всех 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 ⚪ ⛔ ⚫
⚪ ⛔ ⚫
⚪ ⛔
⚪ ⚫
⚪
⛔ ⚫
⛔
⚫
Пустой набор тоже есть, поверь мне.