2011-02-01 7 views
2

저는 bash 프로그래밍의 초보자입니다. 순열을 수행해야하는데,이 포럼에서 한 게시물을 사용하면 Generating permutations using bash입니다.bash를 사용하여 순열 출력 필터링

#!/bin/bash 
    list=`echo {1..12}` 
     for c1 in $list 
     do 
      for c2 in $list 
      do 
       for c3 in $list 
       do 
        echo $c1-$c2-$c3 
       done 
      done 
     done 

출력은

1-1-1

1-1-2

1-1-3 ...

하지만 내가 원하지 않는 줄 (1-1-1)에 반복되는 번호를가집니다. 숫자 1이 첫 번째 위치에있는 경우 두 번째 또는 세 번째 위치에서 번호 1을 원하지 않습니다.

아무도 나를 도울 수있는이

1-2-3

1-2-4

1-2-5

... 같은? 어떤 힌트라도 환영합니다.

+0

예,이 코드는 카트 케이지 제품을 출력하지만이 질문에 대한 대답은 아닙니다 ... – tokland

답변

0

질문 상단의 링크에는 bash에서 순열을 수행하는 방법에 대한 멋진 대답이 포함되어 있습니다.

#!/bin/bash 
list=`echo {1..12}` 
for c1 in $list 
do 
    for c2 in $list 
    do 
     if [ "$c1" != "$c2" ]; then 
      for c3 in $list 
      do 
       if [ "$c1" != "$c3" ]; then 
        echo $c1-$c2-$c3 
       fi 
      done 
     fi 
    done 
done 
+0

1-2-1, 1-2-2, ... 이것은 순열이 아닙니다. OP가 링크 된 질문을 확인하십시오. 수락 된 대답은 이미 그가 요구하는 것을 수행합니다. – tokland

+0

질문에서 내 대답은 c1 대 c3에 대한 확인이 누락되었습니다. 하지만 나는 원하는 답변이 SO 링크에서받은 (아주 좋은) 대답을 사용하는 것인지 확신하지 못합니다. – gabuzo

+0

감사합니다. 정상적으로 작동했습니다. – SanyoLeo

1

나는 당신이 당신의 에코 라인을 변경할 필요가 있다고 생각 :

[ $c1 -ne $c2 -a $c1 -ne $c3 -a $c2 -ne $c3 ] && echo $c1-$c2-$c3 
0

이 할 일을합니까하지만 그건 당신이 그렇게 찾고있는 대답 나는 다음과 같은 스크립트를 사용하는 것이 좋습니다하지 생각 뭘 찾고 있니?

#!/bin/bash 
list=$(echo {1..12}) 
for c1 in $list 
do 
    for c2 in $list 
    do 
     if ((c2 != c1)) 
     then 
      for c3 in $list 
      do 
       if ((c3 != c2 && c3 != c1)) 
       then 
        echo $c1-$c2-$c3 
       fi 
      done 
     fi 
    done 
done 

부분 출력 : 질문에

1-2-3 
1-2-4 
1-2-5 
1-2-6 
1-2-7 
1-2-8 
1-2-9 
1-2-10 
1-2-11 
1-2-12 
1-3-2 
1-3-4 
... 
12-10-8 
12-10-9 
12-10-11 
12-11-1 
12-11-2 
12-11-3 
12-11-4 
12-11-5 
12-11-6 
12-11-7 
12-11-8 
12-11-9 
12-11-10 
0

솔루션은 데카르트의 제품을 제공합니다. 다음 함수는 값 집합의 순열을 생성합니다.

declare -a set=(1 2 3)    # set to permute 
declare -i n=${#set[@]} 

permute() 
{ 
    declare -i k=$1 
    declare -i i 
    declare -i save 
    if [ $k -lt $((n-1)) ] ; then 
    for ((i=k; i<n; i+=1)); do 
     save=${set[k]}     # exchange elements 
     set[k]=${set[i]} 
     set[i]=$save 
     permute $((k+1))    # recurse 
     save=${set[k]}     # exchange elements 
     set[k]=${set[i]} 
     set[i]=$save 
    done 
    else 
    (IFS='-'; echo -e "${set[*]}") 
    fi 
} # ---------- end of function permute ---------- 

permute 0 

출력 :

1-2-3 
1-3-2 
2-1-3 
2-3-1 
3-2-1 
3-1-2 
0

나는 비슷한 문제가되었지만 텍스트 문자, 그래서 단지의 경우에 도움이 될 수 :

for i in {a..z} ; do for b in {a..z} ; do [[ ! "$i" == "$b" ]] && echo -e "$i $b" | xargs -n 1 | sort | xargs ; done ; done | sort -u 

그것은 Z까지를 순열 것 반복 문자가 아닌 "aa"뿐만 아니라 요소의 "인라인 정렬"덕분에 "ab"와 같은 "ab"및 "ba"와 같은 중복이없는 to를 사용할 수도 있습니다 (xargs | sort | xargs), 마지막으로 "sort -u"(또는 " uniq ").

관련 문제