生成字符串的最佳方法

生成字符串的最佳方法

我想生成所有字符串的列表abcd1234。不用说,abcd会循环遍历所有字母az4 次)并1234循环遍历 0 到 9(4 次)。所有这些字符串我都存储在一个文本文件中。作为第二个愿望,我希望这个程序有一个恢复功能。例如,如果程序停止,那么它应该从停止的地方启动。

通过强力方法(即运行 8 个循环),我能够实现第一部分。(下面的代码)。我知道这是最不好策略。对于改进有什么想法吗?

对于第二部分,我通过选择输出文件的最后一行然后选择每个字符。但是在我的方法中,我遗漏了许多字符串。我知道错误(在我的思维/方法中)在哪里,但我无法纠正它。任何形式的帮助都值得感激!

提前致谢。

我的代码:

#!/bin/bash

outfile=$1

if [ ! -f $outfile ]
then
    echo "aaaa0000" > $outfile
fi

lastword=$(tail -1 $outfile)
a_beg=${lastword:0:1}
b_beg=${lastword:1:1}
c_beg=${lastword:2:1}
d_beg=${lastword:3:1}
i_beg=${lastword:4:1}
j_beg=${lastword:5:1}
k_beg=${lastword:6:1}
l_beg=${lastword:7:1}

# echo $a_beg
# echo $b_beg
# echo $c_beg
# echo $d_beg
# echo $i_beg
# echo $j_beg
# echo $k_beg
# echo $l_beg
# echo ""
echo "$a_beg$b_beg$c_beg$d_beg$i_beg$j_beg$k_beg$l_beg"

## This removes the $lastword, as the following loop repeats it!
sed -i '$ d' $outfile


for a in $(eval echo {$a_beg..z})
do
    for b in $(eval echo {$b_beg..z})
    do
        for c in $(eval echo {$c_beg..z})
        do
            for d in $(eval echo {$d_beg..z})
            do
                for i in $(eval echo {$i_beg..9})
                do
                    for j in $(eval echo {$j_beg..9})
                    do
                        for k in $(eval echo {$k_beg..9})
                        do
                            for l in $(eval echo {$l_beg..9})
                            do
                                echo "$a$b$c$d$i$j$k$l" >> $outfile
                            done
            done
                    done
                done
            done
        done
    done
done

答案1

我想我可以回答你问题的第一部分。第二部分似乎有点复杂 :-(。

对于第一部分,你可以使用 GNU平行线公用事业。

以下命令可以完成这项工作:

parallel echo ::: {a..z} ::: {a..z} ::: {a..z} ::: {a..z} ::: {0..9} ::: {0..9} ::: {0..9} ::: {0..9} > /tmp/a

希望这可以帮助!

-- 迈克

相关内容