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 件のコメント:
コメントを投稿