2011-02-01 62 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-2-3

1-2-4

1-2-5

...

任何人可以幫助我嗎?任何暗示都是值得歡迎的。

+0

是的,此代碼輸出cartessian產品,但這不是該問題的接受答案... – tokland 2011-02-01 13:33:55

回答

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 2011-02-01 13:46:30

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 

它將重排列從A到Z使用a到z,不僅不會重複字符「aa」,而且不會像ab和ba那樣冗餘,只需回覆「ab」,這要感謝元素的「內聯排序」(xargs | sort | xargs ),然後是最後的「sort -u」(或「 uniq的「)。