自動車ナンバープレートの作成

自動車ナンバープレートの作成

形式は次のとおりです。AAA-111

AAAどこで可能であり、[A-Z][A-Z][A-Z]そう111することができますか?[0-9][0-9][0-9]

質問:すべての可能なバリアントを生成するためにbashスクリプトをどのように書くことができますか?

答え1

Chaosが指摘したように、これを達成するために中括弧拡張を使用できます。ただし、-形式に応じて有効にするには、その間の項目を忘れないでください。

echo {A..Z}{A..Z}{A..Z}-{000..999}

1行に1つの項目が必要な場合は、for次のようにループでラップできます。

for i in {A..Z}{A..Z}{A..Z}-{000..999}
do
    echo "$i"
done

> /path/to/fileでこれを行うことができますdone

ループを使用したくない場合は、for次を使用することもできます。tr1行に1つの項目を印刷するようにします。

echo {A..Z}{A..Z}{A..Z}-{000..999} | tr " " "\n"

別のオプションはprintfリストとして印刷することです。これで1つを節約できますtr

printf '%s\n' {A..Z}{A..Z}{A..Z}-{000..999}

答え2

bashで利用可能支柱の拡張:

echo {A..Z}{A..Z}{A..Z}-{000..999}

しかし、注目。このコマンドは26^3*1000(17,5 mio)エントリのリストを生成します。

答え3

多くのメモリ使用を防ぐために、ネストされたループを使用してください。

for az1 in {A..Z}; do
    for az2 in {A..Z} _; do
        for az3 in {A..Z} _; do
            for d1 in {0..9}; do
                for d2 in {0..9}; do
                    printf "$az1$az2$az3-$d1$d2%i\n" {0..9}
                done
            done
        done
    done
done | sed 's/_*-0*/-/'

オプションで、短い文字列をサポートするためにアンダースコアを追加し、完全な形式A-1で合計のような結果を得るために先行ゼロを削除しました。 (この操作をキャンセルする方法については、編集履歴を確認してください。)AB-12ABC-123

答え4

通常、中かっこ拡張を使用してこれらのリストを作成できますが、大きすぎるため、問題は発生しません。約1700万の単語にもかかわらず、Bash 4.4は2 GBのメモリを持つ仮想マシンでリストを正常に作成できず、1.5分後に出力を生成せずにクラッシュしました。

Perlのようなものが良いかもしれません。

perl -le 'foreach $i ("AAA".."ZZZ") { foreach $j ("000".."999") { print "$i-$j" }} ; ' > plates

約5秒以内にリストが生成されます。

Bashでこれを行う必要がある場合は、タスクをより小さなループに分割します。

しかし、実際に達成したいことを達成するより良い方法があるかどうか疑問に思います。 1,700万台の自動車ナンバープレートがすべて含まれていないデータがある場合は、そのナンバープレートをすべて保存する必要はありません。その場合は、シェル以外のもの(データベースなど)を使用できます。

関連情報