Как печатать все подмножества набора?

Как я могу напечатать все подмножества набора, используя скрипт bash. например: {}, {1}, {2}, {1,2} для A = {1,2}, это то, что я уже написал, но я всегда думаю, что должен быть лучший способ, и мой скрипт просто печатает подмножества с 1 или двумя членами не все из них

Я буду благодарен, если вы поможете мне заполнить / переписать этот скрипт.

  • Как создать бесконечный поток строк в bash
  • Как tar-bzip старые файлы в ежегодных группах
  • Как исправить кодировку символов в bash (arch linux)
  • Почему эти бомбы вилки-ракеты работают по-разному, и каково значение & в ней?
  • Удалите несколько строк из файла, используя grep
  • Как проверить тип файла в скрипте
  • #!/bin/bash # Created By: Amirreza Firoozi # License : GPL3+ power() { echo $(( $1 ** $2 )) } update(){ a=${SET[i]} b=${SET[j]} } read -p "Please Enter the set like A={1,q,9} : " TSET echo "$TSET" | sed -e 's/.*=//' -e 's/[{}]//g' -e 's/,/\n/g' > TSET.txt MEM_NUM=$(cat "TSET.txt" | wc -l) ZIR_NUM=$(power 2 $MEM_NUM) mapfile -t SET <TSET.txt for i in "" ${SET[@]};do echo "{$i}" done RESIGN(){ i=0 j=1 } RESIGN m2(){ while [ 1 == 1 ];do if [ $i == $(($MEM_NUM - 1)) ];then break fi while [ "$j" != $MEM_NUM ];do update echo "{$a,$b}" ((j++)) done ((i++)) j=$(($i+1)) done } m2 RESIGN 

  • Печать полей с помощью awk
  • Оболочка и позиционные параметры оболочки
  • Проблемы с find, xargs и egrep
  • Как я могу выполнить команду `history` и не иметь номеров строк, чтобы я мог копировать несколько строк?
  • Что регулирует пределы расширения скобки оболочки?
  • Для перенаправления ввода существуют функциональные различия между bash / zsh <<< «$ (<файл)» и традиционным <file?
  • 2 Solutions collect form web for “Как печатать все подмножества набора?”

    Использование binary массива в качестве функции индикатора для каждого подмножества:

     #!/bin/bash # Prepare the indicator, set to all zeros. binary=() for (( i=0; i<=$#; i++ )) ; do binary[i]=0 done while (( ! binary[$#] )) ; do # Print the subset. printf '{ ' for (( j=0; j<$#; j++ )) ; do (( i=j+1 )) (( binary[j] )) && printf '%s ' ${!i} done printf '}\n' # Increment the indicator. for (( i=0; binary[i]==1; i++ )) ; do binary[i]=0 done binary[i]=1 done 

    Вот рабочая версия вашей программы:

     #!/bin/bash # Created By: Amirreza Firoozi # License : GPL3+ read -p "Please Enter the set like A={1,q,9} : " TSET echo "$TSET" | sed -e 's/.*=//' -e 's/[{}]//g' -e 's/,/\n/g' > TSET.txt MEM_NUM=$(cat "TSET.txt" | wc -l) ZIR_NUM=$(( 2 ** MEM_NUM)) mapfile -t SET <TSET.txt # Created By: Petr Skocik # License : Public Domain IFS=,; for((i=0;i<ZIR_NUM;i++)); do combo=() for((j=0;j<MEM_NUM;j++));do (( (i & 2**j) == 0 )) || combo+=( "${SET[j]}" ) done printf '{%s}\n' "${combo[*]}" done 
    Linux и Unix - лучшая ОС в мире.