
Unix では、次のように 6 つの特定の位置でこれらの文字のすべての可能な組み合わせを作成しようとしています。
- ポジション 1 - A または B または C
- ポジション 2 - A または C
- ポジション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」なので、かなり移植可能です。