わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

ワンライナーで字数順ソート

ある事情で,テキストデータを

  • 字数に関して昇順
  • 同じ字数ならコード順(lexicographic order)

でソートすることにしました.
Ruby 1.9を使えば,字数を求めるのは簡単です.
じゃあプログラムは書かなくて,ワンライナーでできるでしょうと思ったら,予想以上に悪戦苦闘しまして,結果はこのようになりました.

$ ruby -rkconv -e 'puts ARGF.read.toutf8.split(/\n/).sort_by{|a| "%03d%s" % [a.size, a]}' 入力ファイル > 出力ファイル

入力ファイルの文字コードUTF-8ですが,Rubyのコードでは「require 'kconv'」と同じ意味になるコマンドラインオプション「-rkconv」と,文字列へのtoutf8メソッドがないと,エラーになりました.実行環境がCygwinだったのが災いしたのかもしれません.
ソート方法は,数年前ならシュワルツ変換を自前で書かないといけなかったのですが,今ならsort_byです.遅くなるケースもあるとのことですが*1,そんなに数も多くないので,気にしないでいいでしょう.
なお,ソート対象のテキストデータの字数は,1件につき,多くても百数十字でした.桁数に応じて,「"%03d%s"」の3の部分,すなわち桁数を変える必要があります.