-->

2013-08-25

memo: sort

id    uptm   data
...   ...    ...

-k2,2r -k1,1        => ORDER BY uptm DESC, id ASC
-k2,2r -k1          => ORDER BY uptm DESC, id ASC, data ASC
-k3,3r -k2,2r -k1,1 => ORDER BY data DESC, uptm DESC, id ASC

-k1                 => ORDER BY id ASC, uptm ASC, data ASC
-k1 -k3r            => ORDER BY id ASC, uptm ASC, data ASC
-k1,1 -k3,3r        => ORDER BY id ASC, data DESC
"-k1,1" "-k1,1r" のようにXX個目のカラムだけを正順、逆順、という風に書かないと、逆に難しい。



以下は詳細です。

定期的にsortがおかしい、なぜだ?と考えるのでメモを取る。
その都度納得しているような気がするが、なぜ納得したのか覚えていない。

元データ。
$ (echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0")
A z 0
B x 1
A y 1
B z 0

1カラム目~3カラム目までソートしてから、3カラム目でソートしている。
# 3カラム目のソートは2カラム目でソート済みなので無意味?
# 3カラム目はソート済み、という情報が記録されて何回も同じカラムでソートできない?
$ (echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1 -k3
A y 1
A z 0
B x 1
B z 0

1カラム目でソートしてから、3カラム目でソートしている。
$ (echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1,1 -k3,3
A z 0
A y 1
B z 0
B x 1

レコードを1つ増やす。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0")
B z 1
A z 0
B x 1
A y 1
B z 0

1カラム目~3カラム目でソートしてから、3カラム目でソートする。(成功?)
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1 -k3
A y 1
A z 0
B x 1
B z 0
B z 1

1カラム目~3カラム目でソートしてから、3カラム目で逆順ソートする。(失敗)
# 最後の2行が入れ替わることを期待した。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1 -k3r
A y 1
A z 0
B x 1
B z 0
B z 1

1カラム目~2カラム目でソートしてから、3カラム目で逆順ソートする。(成功)
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1,2 -k3r
A y 1
A z 0
B x 1
B z 1
B z 0

1カラム目で逆順にソートする。(成功)
# 元の順序は保証されず、指定した1カラム目だけで見た場合は成功。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1,1r
B x 1
B z 0
B z 1
A y 1
A z 0

1カラム目で逆順にソートしたが、やっぱり正順にしよう。(失敗)
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k1,1r -k1,1
B x 1
B z 0
B z 1
A y 1
A z 0

2カラム目~3カラム目でソートしてから、1カラム目~3カラム目でソート(多分1カラム目のみ有効)する。
# ODER BY 2カラム目 ASC、3カラム目 ASC、1カラム目 ASC、なイメージ。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k2 -k1
B x 1
A y 1
A z 0
B z 0
B z 1

2カラム目~3カラム目でソートしてから、1カラム目~3カラム目で逆順ソート(多分1カラム目のみ有効)する。
# 1カラム目の最後3つ, B,A,B は、3カラム目の最後3つ, 0,0,1 のほうが優先なので、おかしくない。
# ODER BY 2カラム目 ASC、3カラム目 ASC、1カラム目 DESC、なイメージ。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k2 -k1r
B x 1
A y 1
B z 0
A z 0
B z 1

2カラム目でソートしてから、1カラム目~3カラム目で逆順にソート(1カラム目、3カラム目の順にソート)する。
# ODER BY 2カラム目 ASC、1カラム目 DESC、3カラム目 DESC、なイメージ。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k2,2 -k1r
B x 1
A y 1
B z 1
B z 0
A z 0

2カラム目でソートしてから、1カラム目で逆順にソートする。
# ODER BY 2カラム目 ASC、1カラム目 DESC、なイメージ。
# B z 0
# B z 1 <= ここら辺の順番は確定ではない。
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k2,2 -k1,1r
B x 1
A y 1
B z 0
B z 1
A z 0

2カラム目でソートしてから、1カラム目で逆順にソートしてから、3カラム目で逆順にソートする。
# ODER BY 2カラム目 ASC、1カラム目 DESC、3カラム目 DESC、なイメージ。
# B z 1
# B z 0 <= ここら辺の順番を"B z 0","B z 1"にする場合は -k3,3r => -k3,3
$ (echo "B z 1" && echo "A z 0" && echo "B x 1" && echo "A y 1" && echo "B z 0") | sort -k2,2 -k1,1r -k3,3r
B x 1
A y 1
B z 1
B z 0
A z 0

バイト単位でソートの場合。
# 多分utf-8の場合は大丈夫。
LC_ALL=C sort

0 件のコメント: