자동차 번호판 생성

자동차 번호판 생성

형식은 다음과 같습니다.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}

행당 하나의 항목을 원하는 경우 for다음과 같이 루프로 래핑할 수 있습니다.

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

> /path/to/file에서 이 작업을 수행할 수 있습니다 done.

루프를 사용하지 않으려면 for다음을 사용할 수도 있습니다.tr한 줄에 하나의 항목을 인쇄하도록 합니다.

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

또 다른 옵션은 printf목록으로 인쇄하는 것입니다. 이것 으로 하나 를 절약할 수 있습니다 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으로 합계와 같은 결과를 얻을 수 있도록 선행 0을 제거했습니다 . (이 작업을 취소하는 방법을 알아보려면 편집 기록을 확인하세요.)AB-12ABC-123

답변4

일반적으로 중괄호 확장을 사용하여 이러한 목록을 만들 수 있지만 너무 커서 문제가 발생할 수 없습니다. 약 1700만 단어에 불과함에도 불구하고 Bash 4.4는 2GB 메모리가 있는 가상 머신에서 목록을 성공적으로 작성하지 못했고 1.5분 후에 아무런 출력도 생성하지 않고 충돌했습니다.

Perl과 같은 것이 더 나을 수도 있습니다.

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

약 5초 안에 목록이 생성됩니다.

Bash에서 이 작업을 수행해야 한다면 작업을 더 작은 루프로 나누십시오.

하지만 실제로 달성하려는 것을 달성하는 더 좋은 방법이 있는지 궁금합니다. 1,700만 개의 자동차 번호판이 모두 포함되지 않은 데이터가 있는 경우 해당 번호판을 모두 저장할 필요는 없을 것입니다. 그렇다면 쉘이 아닌 다른 것(예: 데이터베이스)을 사용할 수 있습니다.

관련 정보