さまざまなデータ型で複数の列を並べ替える方法

さまざまなデータ型で複数の列を並べ替える方法

これはタブ区切りファイルt.tsvです。

$ cat t.tsv
2022/05/05  -258.03
2022/05/07  -18.10
2022/05/09  -10.74
2022/05/09  -132.60
2022/05/12  -18.56
2022/05/12  -20.20
2022/05/17  -11.00
2022/05/17  -112.91
2022/05/17  -51.43
2022/05/17  -64.78
2022/05/18  -13.96
2022/05/18  -13.96
2022/05/18  -7.51
2022/05/19  -17.08
2022/05/20  -33.08

私はMacOS 12.4タイプを使用しています(マンページから:ソートユーティリティは、IEEE Std 1003.1-2008(「POSIX.1」)仕様に準拠しています。)最初にアルファシーケンスの昇順でcol 1を基準にソートし、次に数値の昇順でcol 2を基準にソートします。

$ cat t.tsv|sort --field-separator='\t' --key=1,1 --key=2,2n
2022/05/05  -258.03
2022/05/07  -18.10
2022/05/09  -10.74
2022/05/09  -132.60
2022/05/12  -18.56
2022/05/12  -20.20
2022/05/17  -11.00
2022/05/17  -112.91
2022/05/17  -51.43
2022/05/17  -64.78
2022/05/18  -13.96
2022/05/18  -13.96
2022/05/18  -7.51
2022/05/19  -17.08
2022/05/20  -33.08

2番目の列が昇順でソートされていない理由は何ですか?数字最初の列が同じ場合の順序です。同じ質問に対する多くのSE回答では、(a)単一の列をとして指定し、(b)このオプションを単一のキー定義に--key=1,1適用できると言います。-n--key=2,2n

修正する:私のシェルはbash

答え1

sort理解する実装\tや使用すべきその他の文字表現がわかりません。ANSI-Cの引用代わりに:

sort --field-separator=$'\t' --key=1,1 --key=2,2n t.tsv

その上によるとこのmacOSのマニュアルページAppleのソートマニュアルページには、上記のすべてのオプションのGNUロングオプションが含まれていますが、これらのオプションはまだmacOSで実装されていません。「最新バージョンのmacOSでは、--keyどちらも--field-separator実装ごとに異なりますが、sort移植性のためにまだ標準的な短いオプションを使用しています.

sort -t $'\t' -k 1,1 -k 2,2n t.tsv

上記のコマンドは、macOS、GNU、およびbusyboxからsort次のものを返します。

$ sort -t $'\t' -k 1,1 -k 2,2n t.tsv
2022/05/05  -258.03
2022/05/07  -18.10
2022/05/09  -132.60
2022/05/09  -10.74
2022/05/12  -20.20
2022/05/12  -18.56
2022/05/17  -112.91
2022/05/17  -64.78
2022/05/17  -51.43
2022/05/17  -11.00
2022/05/18  -13.96
2022/05/18  -13.96
2022/05/18  -7.51
2022/05/19  -17.08
2022/05/20  -33.08

関連情報