シェルスクリプトで序数をアルファベットにマッピングする

シェルスクリプトで序数をアルファベットにマッピングする

シェルスクリプトで序数(たとえば、1、2、3、...)を文字a、b、cにマッピングする簡単なソリューションはありますか?

答え1

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

(最新バージョンでは、またはksh93この行を次のように短縮できます)bashzshsetset {a..z}

または:

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

いくつかの実装ではdc(少なくともGNU dc):

$ echo 96 5 + P | dc
e

パスすると、zshデフォルトの36を使用できます。

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

または、次の\0ooo8進数シーケンスを使用してくださいprintf %b

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

英語以外の文字の場合は、UTF-8ロケール(ここではギリシャ語)を想定しています。

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

これはUnicodeの文字順序に基づいており、その順序がその地域の言語の一般的なアルファベット順序と一致するという保証はないため、文字リスト全体を手動でハードコードして最初の形式を使用することもできます。

ロシアのアルファベットのように(Wikipediaによると):

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

これはUnicodeの順序とまったく一致しません。

関連情報