增加一个字母序列来表示一个整数,其中 a=0 和 z=25

increment a letter sequence to represent a whole number where a=0 and z=25

我尝试了几个不同的搜索词,但没有找到我想要的东西,我相信已经有答案了,如果有的话请指出我。

我想了解如何在 bash 脚本中给定标准数字约定来递增字母代码。

AAAA=0 或前导零开始 AAAA=000000 (26x26x26x26) 我想每次都用正数递增该值,所以 aaab=000001,aaac=000002aaba=000026aaaca=000052 等等

感谢艺术!

我想这就是你想要的

echo {a..z}{a..z}{a..z}{a..z} | tr ' ' '\n' | nl

会太长,也许先用这个测试一下

 echo {a..z}{a..z} | tr ' ' '\n' | nl

如果您不需要行号,请删除最后一个管道和 nl

如果需要xxxx=nnnnnn格式的输出,可以使用awk

echo {a..z}{a..z}{a..z}{a..z} | tr ' ' '\n' | awk '{printf "%s=%06d\n", [=12=], NR-1}'

aaaa=000000
aaab=000001
aaac=000002
aaad=000003
aaae=000004
aaaf=000005
aaag=000006
aaah=000007
aaai=000008
aaaj=000009
...
zzzv=456971
zzzw=456972
zzzx=456973
zzzy=456974
zzzz=456975

使用 perl,您可以 ++ 一个字符串来递增字母:

for (my ($n,$s) = (0,"aaaa"); $n < 200; $n++, $s++) {
    printf "%s=%0*d\n", $s, length($s), $n;
}

产出

aaaa=0000
aaab=0001
aaac=0002
aaad=0003
...
aaby=0050
aabz=0051
aaca=0052
aacb=0053
...
aahp=0197
aahq=0198
aahr=0199

如果您的目标是速度和简单性:

#!/bin/bash
i=0
for text in {a..z}{a..z}{a..z}{a..z}; do
    printf '%06d %5.5s\n' "$i" "$text"
    (( i++ ))
done

精确

旨在拥有一个将任意数字转换为字符串的函数:

我们必须明白,你所描述的是一个以26进制写的数字,使用字符a作为0b作为1c3,等等

因此,aaaa表示0000aaab表示0001aaac表示0002,.... aaaz 表示 0025
aaba 表示 0026aaca 表示 0052

bc 可以直接进行基本转换(作为数字):

$ echo 'obase=26; 199'|bc
07 17

第7个字母是:a0,b1,c2,d3,e4,f5,g6,(h)7,
第17个字母是(r).

如果我们将变量列表设置为:list=$(printf '%s' {a..z})list=abcdefghijklmnopqrstuvwxyz

我们可以从数字中获取每个字母:${list:7:1}${list:17:1}

$ echo "${list:7:1} and ${list:17:1}"
h and r
$ printf '%s' "${list:7:1}" "${list:17:1}"    # Using printf:
hr

脚本

全部放在一个脚本里面,就是:

#!/bin/bash

list=$(printf '%s' {a..z})

getletters(){
    local numbers
    numbers="$(echo "obase=26; "|bc)"
    for number in $numbers; do
        printf '%s' "${list:10#$number:1}";
    done;
    echo;
}

count=2
limit=$(( 26**$count - 1 ))

for (( i=0; i<=$limit; i++)); do
    printf '%06d %-5.5s\n' "$i" "$(getletters "$i")"
done

请将计数从 2 更改为 4 以获得整个列表。请注意,这样的列表超过 50 万行:限制为 456,975,需要一些时间。