Фильтрация вывода перестановок с использованием bash - PullRequest
2 голосов
/ 01 февраля 2011

Я действительно новичок в программировании на 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

...

Кто-нибудь может мне помочь?Любой намек приветствуется.

Ответы [ 5 ]

1 голос
/ 01 февраля 2011

Я думаю, вам нужно изменить строку эха на:

[ $c1 -ne $c2 -a $c1 -ne $c3 -a $c2 -ne $c3 ] && echo $c1-$c2-$c3
0 голосов
/ 14 мая 2016

У меня была похожая проблема, но с текстовыми символами, так что на всякий случай это может помочь:

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 to z с a по z, не только без повторяющихся символов «aa», но и без избыточностей, таких как «ab» и «ba», повторяя только «ab», благодаря «встроенной сортировке» "of elements (xargs | sort | xargs), за которым следует финальная" sort -u "(или" uniq ").

0 голосов
/ 01 февраля 2011

Решение в вопросах дает декартово произведение.Следующая функция генерирует перестановки набора значений.

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 голосов
/ 01 февраля 2011

Делает ли это то, что вы ищете?

#!/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 голосов
/ 01 февраля 2011

Ссылка в верхней части вашего вопроса уже содержит хороший ответ о том, как делать перестановки в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...