用bash打印字母表

时间:2014-06-09 15:26:57

标签: linux bash

我想帮助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)

之后,我被困住了。一点帮助?

4 个答案:

答案 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 )