• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

IPアドレスのソートがちょっと面倒。

普通にRubyを使ってIPアドレスをソートしようとすると、
ruby>>
ip_addrs = ["192.100.100.1", "192.11.11.1", "192.11.100.1"]
ip_addrs.sort
#=> ["192.100.100.1", "192.11.100.1", "192.11.11.1"]
<<ruby
となって、きちんとソートされない。
まぁ、当たり前と言えば当たり前なんですが・・・。

きちんとソートするためには、こんな感じにしてみる。
ruby>>
ip_addrs.sort_by{|a| a.split(".").map{|i| "%3d" % i.to_i}}
#=> ["192.11.11.1", "192.11.100.1", "192.100.100.1"]
<<ruby

もうちょっと綺麗に書けんなぁ?
"%3d"とか、なんか嫌やなぁ。

ちなみにシェルだと、
shell-unix-generic>>
$ echo '
192.100.100.1
192.11.11.1
192.11.100.1
' | sort -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4 -n

192.11.11.1
192.11.100.1
192.100.100.1
<<shell-unix-generic

とかできるけど、-kオプションが気に入らない感じ。

もっと綺麗に書ける方法はないのだろうか・・・。

posted by y_tsuda y_tsuda on Mon 15 Sep 2008 at 17:45 with 3 comments
瀧内元気 瀧内元気 09/15 19:57
こんなのはどうでしょう?

ruby>>
> ["192.100.100.1", "192.11.11.1", "192.11.100.1"].sort_by{|i| Socket.sockaddr_in nil, i}
=> ["192.11.11.1", "192.11.100.1", "192.100.100.1"]
<<--
Yu Tsuda Yu Tsuda 09/16 22:04
うわ!めっちゃシンプル!!
参考にさせていただきます!!
Yu Tsuda Yu Tsuda 09/22 01:02
変なことしなくても、普通にこれで良かった・・・。
ruby>>
ip_addrs.sort_by{|a| a.split(".").map{|i| i.to_i}}
#=> ["192.11.11.1", "192.11.100.1", "192.100.100.1"]
<<ruby
あのとき何を考えていたのだろう・・・
Contents rssrss
Xperiaにインストールして1週間生き残ったアプリたち
gem serverをIE8から見るとヒドイことになる現象を解決
gem serverをIE8から見るとヒドイことに
Twitter, Account Suspended
GentooにRuby1.9をインストールした
GentooにScalaをインストールしてみた
多面ディスプレイ環境を手作りしてみた
lower-camel caseな文字列とアンダースコア区切りな文字列の相互変換をRubyで
topコマンドでのCPUコア毎の表示
Fedora11 (on VirtualBox) 速効レビュー
Tags
rubyGentooDIYFedoralinuxmemoScalatwitterunixvirtualboxweb
Comments rssrss
rysonqem rysonqem: something new and exciting rysonqem http://www.g2... 04/23 23:37
cvcwcbbfp cvcwcbbfp: something new and exciting [url=http://www.g1h6r6... 04/10 13:40
Aleksey Aleksey: The uname check is only due to a somewhat sloppy t... 02/02 07:03
Yu Tsuda Yu Tsuda: あぁ、そうですね、、syncすると戻ってしまいますね・・・。 ご指摘ありがとうございます!! 07/11 15:38
ursm ursm: /usr/portage 以下のファイルは更新のたび元に戻ってしまうので、/etc/portage/... 07/11 13:46
Yu Tsuda Yu Tsuda: 見た目だけでも、わざわざGentooをこういうリストに入れてるのがすごいなぁと思ったりしたのです(笑... 03/31 19:49
Leonard Chin (レオ) Leonard Chin (レオ): ただし、VirtualBoxで「Gentoo」などを選択しても、別にどのOSを入れても大丈夫だ。あく... 03/31 13:00
Yu Tsuda Yu Tsuda: この機能、結構便利なんですよねー。 またEmacsで便利な機能を見つけたらブログに書きまーす。 11/27 23:46