bash + how to convert b-z characters to integer numbers that start from 1

Viewed 98

in my bash script I want to convert the a-z characters to integer numbers

so I wrote the following

[[ $var == b ]] && var=1
[[ $var == c ]] && var=2
[[ $var == d ]] && var=3
[[ $var == e ]] && var=4
[[ $var == f ]] && var=5
[[ $var == g ]] && var=6
[[ $var == h ]] && var=7
[[ $var == i ]] && var=8
[[ $var == j ]] && var=9
[[ $var == k ]] && var=10
[[ $var == l ]] && var=11
[[ $var == m ]] && var=12
[[ $var == n ]] && var=13
[[ $var == o ]] && var=14
[[ $var == p ]] && var=15
[[ $var == q ]] && var=16
[[ $var == r ]] && var=17
[[ $var == s ]] && var=18
[[ $var == t ]] && var=19
[[ $var == u ]] && var=20
[[ $var == v ]] && var=21
[[ $var == w ]] && var=22
[[ $var == x ]] && var=23
[[ $var == y ]] && var=24
[[ $var == z ]] && var=25

the approach as described above isn't elegant , and I want to know if we can do it more shorter

any suggestions?

4 Answers

With GNU awk for the ordchr library:

$ awk -v let='a' -l ordchr 'BEGIN{print ord(let)}'
97

$ awk -v num='97' -l ordchr 'BEGIN{print chr(num)}'
a

$ awk -v let='a' -l ordchr 'BEGIN{print ord(let) - ord("a") + 1}'
1

With any awk, assuming the ASCII char set:

$ awk -v let='a' 'BEGIN{for (i=0;i<=255;i++) ord[sprintf("%c",i)]=i; print ord[let]}'
97

$ awk -v num='97' 'BEGIN{printf "%c\n", num}'
a

I expect your locale would be a factor so you should probably set LC_ALL=C first.

You can use printf to get the ordinal of a character:

$ printf "%d\n" "'a"
97

Then use expr to do integer math:

$ expr $(printf "%d\n" "'a") - 96 
1

You could also use perl:

$ echo 'a' | perl -lanE 'say ord($F[0])-96'
1

For awk you would need to write a function for ord

Another way using an associative array.

#!/usr/bin/env bash    


n=1 ##: starts at one.

for letters in {a..z}; do
  declare -A alpha["$letters"]=$((n++))
done

printf '%s\n' "${alpha[@]}"

You can access the numerical value by calling the alphabet equivalent.

printf '%s\n' "${alpha[a]}"

Prints 1

and so on.

Related