sortコマンドでひらがなを並べ替えてみます

こんにちは、さるまりんです。

今回はsortコマンドの実験です。

こんなファイルがあります。

cities.txt

なごや
さっぽろ
やまぐち
おおさか
とうきょう
せんだい
かごしま
なは

ひらがなで日本の都市名がいくつか記録されています。

僕の開発環境であるmacOS Venturaのマシンでこのファイルに単純にsortコマンドをかけてみます。

$ sort cities.txt
なは
なごや
おおさか
かごしま
さっぽろ
せんだい
やまぐち
とうきょう

並び順は変わりましたが、五十音順になったわけではないですね。

これを次はこんな風に環境変数LANGを指定してsortコマンドをかけてみます。

$ LANG=ja_JP.utf8 sort cities.txt
おおさか
かごしま
さっぽろ
せんだい
とうきょう
なごや
なは
やまぐち

お!五十音順になりましたね。

今度はAmazon Linux上に同じファイルを置いてやってみます。

シンプルにsortをかけます。

$ sort cities.txt
おおさか
かごしま
さっぽろ
せんだい
とうきょう
なごや
なは
やまぐち

お!すでに五十音順で並んでいますね。

同じようにLANGを指定してみます。

$ LANG=ja_JP.utf8 sort cities.txt
おおさか
かごしま
さっぽろ
せんだい
とうきょう
なごや
なは
やまぐち

同じ結果が得られました。

差は何か?

どちらのマシンでもlocaleコマンドを実行してみます。

まずはmacOSのマシン。

$ locale
LANG="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_CTYPE="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_ALL=

次はLinuxです。

$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

めちゃくちゃ細かいですがLANGja_JP.UTF-8がmacOSではダブルクオートに囲まれていて、Linuxでは囲まれていません。
その違いは何かをlocaleコマンドのmanpageで見てみるとこんな風に書いてあります。

Values for variables set in the environment are printed without double quotes, implied values are printed with double quotes.

簡単に訳してみます。
「環境内で設定された変数の値はダブルクオートなし、暗黙の値はなしで出力されます」

と言うことなので、macOSの方はLANGが明示的に設定されておらず暗黙の状態だったので、五十音順に並び替えられなかったと推測されます。(違うかもしれませんが。。)

環境差ってこう言うところから生まれるのですね。
環境違いでプログラムの挙動が変わったらまずは調査。

envコマンドで環境変数の一覧を見る、localeコマンドでロケールの情報を見る。
この辺りから始めるのがいいかもしれないです。

環境違いで動かないとかハマることが多いです。
いろんなトラブル対応の方法を勉強していきたいと思います。

読んでくださってありがとうございました。

それではまた!