모든 조합에 대해 5자리 길이의 배열을 생성하는 bash 스크립트가 있습니다.
#!/usr/bin/env bash
for combo in \
{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9}\
{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9}\
{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9}\
{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9}\
{a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,0,1,2,3,4,5,6,7,8,9};
do echo $combo;
done > output.txt
그러면 다음이 출력됩니다.
$ ./script.sh
aaaaa
aaaab
aaaac
...
그러나 이것은 내 컴퓨터를 정지시킵니다. 점진적으로 파일에 데이터를 쓰는 방법이 있습니까? 또한 출력을 각각 65536줄씩 다른 파일로 분리할 수 있습니까? 출력 1.txt, 출력 2.txt, 출력 3.txt처럼요?
당신의 도움을 주셔서 감사합니다!
답변1
셸에서 엄청난 양의 메모리를 차지하지 않고 이러한 큰 순열을 생성하는 것은 어렵습니다.
Python과 같은 다른 언어를 사용해 볼 수 있습니다.
$ python -c '
import itertools, string
l = [c for c in string.ascii_lowercase + string.digits]
for p in itertools.product(l, l, l, l, l): print "".join(p)
' > file
답변2
느리기는 하지만 중첩 루프를 사용할 수 있습니다.
for p in {a..z} {0..9}
do for q in {a..z} {0..9}
do for r in {a..z} {0..9}
do for s in {a..z} {0..9}
do for t in {a..z} {0..9}
do echo $p$q$r$s$t
done
done
done
done
done | split -l 65536 --numeric-suffixes=1 --additional-suffix=.txt - output
답변3
crunch
It's writing in C 라는 훌륭한 도구를 찾았습니다 . 파일 크기나 줄별로 출력 파일을 분리하도록 선택할 수도 있습니다!
설치하다:$ sudo apt-get install crunch
#!/usr/bin/env bash
crunch 5 5 abcdefghijklmnopqrstuvwxyz0123456789 -o output/START -c 1048576 # Excel line limit
출력 폴더에서 이 명령으로 생성된 파일 aaaaa-awrdd.txt, awrde-bi8gh.txt, bi8gi-b5pjl.txt, etc.
에는 정확히 1.048.576개의 행이 포함되어 있으며 이는 Excel 2007+ 행 제한입니다. 이것은 또한 매우 빠른 솔루션입니다. 단 10초 만에 58개 파일에서 60,000,000개 이상의 조합을 생성하세요! 완벽한!
답변4
bash
RAM의 모든 요소는 루프 반복을 사용하기 전에 항상 할당됩니다 for
. 본질적으로 bash
한 번에 많은 양의 메모리를 할당해야 하는데 컴퓨터에 그렇게 많은 메모리가 없기 때문에 충돌/멈춤이 발생합니다.
bash
조합 자체는 그렇게 많이 필요하지 않지만(대략 계산해 보면 500MB 정도), 배열을 다룰 때 엄청난 오버헤드가 발생할 것 같아요 .
사용 가능한 메모리가 얼마나 되는지 정확히 알고 싶습니다.