- PR -

Solaris8 sort -n オプションの指定について

1
投稿者投稿内容
kio
会議室デビュー日: 2004/04/20
投稿数: 2
投稿日時: 2005-07-30 16:50
OS:Solaris8

固定長のファイルを管理番号、金額でソートしようとしています。
金額については -n オプションを使用しているのですが、
-n オプションを指定するとソート結果に反映されません。
(管理番号にはソート結果に反映されます。
 また、-n を指定しない場合は文字列としてソートされます。)
金額の書式が「符号+前ゼロつき数値」となっているのですが、
この書式の場合は -n オプションは有効にならないのでしょうか?

以下、実行内容になります。
==ソート前データ内容==
0920000000320050505-000000010000
0920000000320050505-000000110000
0920000000320050505+000000011000
0920000000320050505+000000000000
0920000000320050501+000000012000
0920000000220050516+000000000000
0920000000220050517+000000000000
0920000000420050505+000000005000
0920000000420050505+000000013000
0920000000420050505+000000000000
(1〜11byteが管理番号、20byte以降が金額になります。)

==実行ソートコマンド==
LANG=C
sort -k 1.1,1.11 -k 1.20n <固定長ファイル名>

==ソート後データ内容==
0920000000220050516+000000000000
0920000000220050517+000000000000
0920000000320050505-000000110000
0920000000320050505-000000010000
0920000000320050501+000000012000
0920000000320050505+000000000000
0920000000320050505+000000011000
0920000000420050505+000000000000
0920000000420050505+000000005000
0920000000420050505+000000013000
(管理番号ではソートされているが、金額では
 ソートされていない。)

-n オプションの制限として
「先行するゼロおよびゼロに付けた正負符号は
 順序付けに影響を与えません。 」というものがありますが
この影響なのかな?と疑っているのですが・・・
どなたか解決のヒントをいただけないでしょうか?
よろしくお願いいたします。


[ メッセージ編集済み 編集者: kio 編集日時 2005-07-30 16:52 ]
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-08-01 16:56
こんにちは。もう解決されていればよろしいのですが。
引用:
(管理番号ではソートされているが、金額では
 ソートされていない。)


良く見ると、ちゃんと正しくソートされているようですよ。
一度ご確認あれ。
kio
会議室デビュー日: 2004/04/20
投稿数: 2
投稿日時: 2005-08-01 18:56
ご返答いただきありがとうございます。
ソート結果について、管理番号「09200000003」のレコードは

0920000000320050505-000000110000
0920000000320050505-000000010000
0920000000320050501+000000012000 <-
0920000000320050505+000000000000 <-
0920000000320050505+000000011000 <-

ではなく

0920000000320050505-000000110000
0920000000320050505-000000010000
0920000000320050505+000000000000 <-
0920000000320050505+000000011000 <-
0920000000320050501+000000012000 <-

となることを想定していました。
ソートコマンドに対して、この結果はあっていないと
思うのですが・・・

[ メッセージ編集済み 編集者: kio 編集日時 2005-08-01 18:57 ]
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2005-08-01 20:04
おっと…。大変失礼しました。
先頭11文字が管理番号でしたね。確認不足でした。

手元にSolarisが無い為、POSIX準拠のはずのcygwinで試してみたのですが、どうも上手くいかないようです。やはり“+”があると、数値ソートに対応できない様子。
※Linuxなら g オプションが使えるようですが…

回避策になりますが、“+”を空白に変えると、手元では上手くソートされました。
今回のようなファイルのフォーマットであれば、使えるのではないかと思います。

コマンドとしては、
 $ sed -e 's/+/ /' ファイル名 | sort -k 1.1,1.11 -k 1.20n | sed -e 's/ /+/'

以上、ご参考まで。
1

スキルアップ/キャリアアップ(JOB@IT)