作者: Koichi Yamamoto
日時: 2004/1/11(22:39)
山本です。

"HFC01730@... (水羽信男)"さんは書きました:
> 僕のデータファイルは、今はワードパッドで作成して、それを
> Unicodeを選択して、保存しています。

BOM付きlittle-endianのunicodeテキストですね。

> が、ご提供していただいスクリプトは、欄を0と1と指定した場
> 合何もせず、そのままデータをコンソールに吐き出します。

一つ目の問題については後ほど解説することにして、

> 欄の指定を3以上にすると、以下のようなエラーメッセージが
> 出てきます。
> ------------------------------
> element 3 missing from sublist "{ } {}"
> ------------------------------

データファイルの末端が次のようになっていませんか?
<改行>
<半角空白文字><改行>
<EOF>

前回送ったスクリプトの13行目を修正してみてください:

foreach i [split [string trim [regsub -all -- {\n[ \n]+} $data \0] \0] \0] {

> 今回、実験したサンプルデータは、次のようになります。
(省略)

「卞之下」「王芸生」「王迅中」をソートしようとして
並べ替えられなかったのは、ソート時の文字コードが
unicodeであることに原因があります。これらのお名前を
各種文字コード(16進数)で表現すると以下のようになります。

      |  unicode     |  cp932(sjis) |  gb2312
---------+--------------+--------------+--------------
(a)卞之下|535e 4e4b 4e0b|99c4 9456 89ba|b1e5 d6ae cfc2
(b)王芸生|738b 82b8 751f|89a4 8c7c 90b6|cdf5 dcbf c9fa
(c)王迅中|738b 8fc5 4e2d|89a4 9076 9286|cdf5 d1b8 d6d0

それぞれを昇順で並べ替えると:

unicode : (a)→(b)→(c)
cp932   : (b)→(c)→(a)
gb2312  : (a)→(c)→(b)

ですから、「王」のように同じ名字でまとめるという目的であれば
unicodeでソートしてもよいと思いますが、cp932(シフトJIS)と同じ
結果を得る必要があるならば、cp932でソートしてやるように
スクリプトを作り替えてやらないといけません。

--
Koichi Yamamoto, 
http://homepage3.nifty.com/yamakox/