使用bash过滤排列的输出

时间:2011-02-01 13:18:44

标签: bash shell permutation

我真的是一个关于bash编程的新手,我需要执行一个排列,我使用这个论坛中的一个帖子做了如下Generating permutations using 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

...

任何人都可以帮助我吗?任何提示都是受欢迎的。

5 个答案:

答案 0 :(得分:1)

我认为您需要将回声线更改为:

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

答案 1 :(得分: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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分: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“)。