增加一个字母序列来表示一个整数,其中 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=000002
和 aaba=000026
和 aaaca=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
作为0
,b
作为1
,c
为 3
,等等
因此,aaaa
表示0000
,aaab
表示0001
,aaac
表示0002
,.... aaaz
表示 0025
aaba
表示 0026
,aaca
表示 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,需要一些时间。
我尝试了几个不同的搜索词,但没有找到我想要的东西,我相信已经有答案了,如果有的话请指出我。
我想了解如何在 bash 脚本中给定标准数字约定来递增字母代码。
从 AAAA=0
或前导零开始 AAAA=000000
(26x26x26x26) 我想每次都用正数递增该值,所以 aaab=000001
,aaac=000002
和 aaba=000026
和 aaaca=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
作为0
,b
作为1
,c
为 3
,等等
因此,aaaa
表示0000
,aaab
表示0001
,aaac
表示0002
,.... aaaz
表示 0025
aaba
表示 0026
,aaca
表示 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,需要一些时间。