Mapear ordinal para alfabeto em shell script

7

Existe alguma solução simples para mapear o número ordinal como 1, 2, 3, ... para o alfabeto a, b, c em um script de shell?

    
por Archer 19.04.2016 / 18:11

1 resposta

11

Em conchas semelhantes a Bourne:

$ set a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo "$5"
e

(com versões recentes de ksh93 , bash ou zsh , você pode reduzir a linha set para set {a..z} )

Ou:

$ awk 'BEGIN{printf("%c\n", 0x60 + 5)}'
e

Com algumas implementações de dc (pelo menos,% GNUdc):

$ echo 96 5 + P | dc
e

Com zsh , você pode usar a base 36:

$ echo $(([##36] 9 + 5))
E

Ou use sequências printf %booo octal em %code% :

$ printf '%b\n' "
$ printf '%b\n' "\u$(([##16]0x3B0 + 5))"
ε
$(([##8]0x60 + 5))" e

Para alfabetos não ingleses, assumindo uma localidade UTF-8 (aqui para grego):

$ set а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я
$ echo "$5"
д

É baseado na sequência de caracteres em Unicode, não há muita garantia de que a ordem corresponderá à ordem alfabética comum para o seu idioma na sua região, assim você pode codificar a lista completa de caracteres manualmente e usar a primeira forma.

Como para o alfabeto russo (de acordo com a Wikipedia):

$ set a b c d e f g h i j k l m n o p q r s t u v w x y z
$ echo "$5"
e

Que não corresponde exatamente à ordem Unicode.

    
por 19.04.2016 / 18:26