
В Unix я пытаюсь создать все возможные комбинации этих букв в 6 определенных позициях следующим образом:
- Позиция 1 - A или B или C
- Позиция 2 — А или С
- Позиция 3 - только C
- Позиция 4 — A или D
- Позиция 5 - B или C
- Позиция 6 - C или A
Так, например, комбинации могут быть такими: AACABC, BACABC,...
Есть ли быстрый способ сделать это с помощью UNIX-инструментов?
решение1
Требования соответствуют расширению распорки.
{A,B,C}{A,C}C{A,D}{B,C}{C,A}
Это расширяется до 48 строк (48 = 3*2*1*2*2*2):
$ printf '%s\n' {A,B,C}{A,C}C{A,D}{B,C}{C,A}
AACABC
AACABA
AACACC
AACACA
AACDBC
AACDBA
AACDCC
AACDCA
ACCABC
ACCABA
ACCACC
ACCACA
ACCDBC
ACCDBA
ACCDCC
ACCDCA
BACABC
BACABA
BACACC
BACACA
BACDBC
BACDBA
BACDCC
BACDCA
BCCABC
BCCABA
BCCACC
BCCACA
BCCDBC
BCCDBA
BCCDCC
BCCDCA
CACABC
CACABA
CACACC
CACACA
CACDBC
CACDBA
CACDCC
CACDCA
CCCABC
CCCABA
CCCACC
CCCACA
CCCDBC
CCCDBA
CCCDCC
CCCDCA
решение2
Похоже, это работа для вложенных for
циклов:
#!/bin/bash
for p1 in A B C; do
for p2 in A C; do
for p3 in C; do
for p4 in A D; do
for p5 in B C; do
for p6 in C A; do
echo "$p1$p2$p3$p4$p5$p6"
done
done
done
done
done
done
Возможно, существуют внешние инструменты, которые делают это более элегантно, но этот способ — «100% bash» и, следовательно, довольно переносим.