我想帮助bash中的以下算法(或通过bash shell访问的任何内容):我给一些函数赋一个数字,并根据这个数字我得到一串字母。例如:
1 - A
2 - B
....
26 - Z
....
702 - ZZ
703 - AAA
我不希望占用比我需要的更多内存,因此for i in {A..Z}
或echo {A..Z}
或echo {A..Z}{A..Z}
等方法在此处不可行。我最接近的是通过以下表达式找出特定数字的字母序列有多长:
printf %.0f\\n $(echo '(scale=20;l($number)/l(26))+0.5000000000000000001' | bc -l)
之后,我被困住了。一点帮助?
答案 0 :(得分:4)
试试这个脚本:
#!/bin/bash
alphabet=( {A..Z} )
convertToString(){
dividend="$1"
colName=""
while (( dividend > 0 ))
do
mod=$(( (dividend-1)%26 ))
colName="${alphabet[$mod]}$colName"
dividend=$(( (dividend-mod)/26 ))
done
echo "$colName"
}
convertToString "$1"
示例输出:
$ convertToString 1
A
$ convertToString 2
B
$ convertToString 27
AA
$ convertToString 702
ZZ
$ convertToString 703
AAA
$ convertToString 16384
XFD
$ convertToString 1187803
BOOBS
答案 1 :(得分:0)
#!/bin/bash
function get_alpha {
local N=$1
__=''
if [[ N -gt 0 ]]; then
local CHARS=(0 {A..Z})
while [[ N -gt 26 ]]; do
(( M = N % 26 ))
[[ M -eq 0 ]] && M=26
(( N = (N - M) / 26 ))
__=${CHARS[M]}${__}
done
__=${CHARS[N]}${__}
fi
}
function print_alpha {
get_alpha "$1"
echo "$__"
}
print_alpha 1
print_alpha 26
print_alpha 27
print_alpha 702
print_alpha 703
输出:
A
Z
AA
ZZ
AAA
答案 2 :(得分:0)
#!/bin/bash
received_number=$1 # Read one argument
counter=0 # Initialize counter
while [ $counter -lt $received_number ] # while counter less or equal than received number
do
letter=$(($counter % 26 + 97)) # This is the integer that represents the letter
char=$(printf \\$(printf '%03o' $letter)) # We convert the int to chr
n_times=$(($counter / 26)) # This is how many times we need to print it
final_string="" # This is for reset the variable for each letter
i=0
while [ $i -le $n_times ]
do
final_string=$final_string$char
i=$(( $i + 1 ))
done
counter=$(( $counter + 1 )) # Increase counter
echo $counter " - " $final_string
done
此脚本会覆盖您提供的号码。
如果你制作./script 10
,则输出为:
...
8 - h
9 - i
10 - j
如果您制作./script 26
,则输出为完整字母:
... ... ...
23 - w
24 - x
25 - y
26 - z
如果你./script 52
:
... ... ...
48 - vv
49 - ww
50 - xx
51 - yy
52 - zz
如果你./script 78
:
... ... ...
74 - vvv
75 - www
76 - xxx
77 - yyy
78 - zzz
依旧......
答案 3 :(得分:0)
我只是在寻找一个快速解决方案,并遇到了这个问题,没有“好”的答案(即“快速”)。所以,在这里:
#!/bin/bash
# works up to ZZZ -- i.e., A..Z AA..ZZ AAA..ZZZ
max=$1 # e.g., max=30
echo {A..Z} $(echo {A..Z}{A..Z}) $(echo {A..Z}{A..Z}{A..Z}) \
| tr ' ' '\n' \
| head -${max}
评论,“我不希望占用比我需要更多的内存,所以echo {A..Z}{A..Z}
这样的方法在这里不可行”是荒谬的,所以我在这里发布这个实用的解决方案对于后代,那些在谷歌搜索中遇到这个问题的人。
我的用例是在文件的行前加上“A”..“ZZ”,例如,如果上面的脚本被称为letters.sh
,
lines=$(wc -l my_file.txt)
paste <( cat my_file.txt ) <( letters.sh $lines )