具有内存和资源管理的组合生成器

Lan*_*nti 2 shell bash echo

我有这个 bash 脚本,它生成 5 位长度的数组的每个组合:

#!/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
Run Code Online (Sandbox Code Playgroud)

这将输出:

$ ./script.sh
aaaaa
aaaab
aaaac
...
Run Code Online (Sandbox Code Playgroud)

然而,这只是冻结我的电脑。有没有办法将数据越来越多地写入文件?另外,是否可以将输出分开到不同的文件,例如每 65536 行?比如 output1.txt、output2.txt、output3.txt?

感谢您的帮助!

cuo*_*glm 6

很难在 shell 中不占用大量内存的情况下生成这些大排列。

您可以尝试另一种语言,如 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
Run Code Online (Sandbox Code Playgroud)


meu*_*euh 5

您可以使用嵌套循环,但它会很慢:

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
Run Code Online (Sandbox Code Playgroud)