2014-10-03 6 views
3

변수에 저장된 요소 집합 (n 개의 매개 변수로 변환 가능)에 가능한 모든 순열을 생성하려면 간단한 스크립트를 준비해야합니다. 가장 쉬운 해결책은 다음과 같습니다. 그룹의 선택된 길이에 따라 여러 루프를 사용합니다. 그러나 나는 그래서이 방법을 사용하여 반향을 사용하여 요소 조합 생성

echo {1,2}{1,2} 
    11 12 21 22 

, 나는 그것을 할 수있는 일반적인 방법을 달성하기 위해 노력하고 같이 사용하고 있습니다 즉, 조합을 생성하는 echo 명령의 기능을 활용 더 우아한 될 것이라고 생각 입력 매개 변수 요소 목록 (예 : {1,2}) 및 요소 수. 그것은 같은 것이다 : 반복 변수의 값은 {1,2,3,4} {1,2,3,4}가이 특정한 경우에 따라서

set={1,2,3,4} 
group=3 
for ((i=0; i<$group; i++)); 
do 
    repetition=$set$repetition 
done 

, 루프의 끝에서 {1,2,3,4}. 하지만 echo 명령을 사용하여이 변수를 사용하여 조합을 생성하는 방법을 찾을 수 없습니다. 시도해 보았습니다. 여러 가지를 시도했습니다.

echo $repetition 
echo $(echo $repetition) 

나는 그것에 붙어있어, 어떤 조언이나 도움이됩니다.

+0

작업의 경우 요소 순서가 중요해 보입니다. 따라서 입력의 모든 순열을 열거하는 알고리즘을 찾고 있습니다. * 조합 *을 생성하는 알고리즘을 실제로 찾고있는 사람들은이 질문을 통해 오도됩니다. – josch

+0

감사합니다. Josch, 당신 말이 맞아요. 나는 당신의 권고에 따라 질문을 더 명확하게하기 위해 그 질문에 찬사를 보냈습니다. – Toni

답변

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 

또는를 대신 bash -c

0

eval를 사용하면 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/[0-9] + [] */0/g '\'' –