Bash 数値ソートは、列を同時に選択したときと同時に列を選択したときに異なる結果を提供します。

Bash 数値ソートは、列を同時に選択したときと同時に列を選択したときに異なる結果を提供します。

次のデータ例では、両方の列は数値ですが、2番目の列の桁数は異なります。

2 9
1 1000
1 50
3 0

2つの列に基づいてソートしたいです。数値フラグを使用して個別に指定すると、目的の-n結果が生成されます。

sort -n -k1,1 -k2,2 num.data.txt

与えられた

1 50
1 1000
2 9
3 0

これが私が望むものです。

しかし、

sort -n -k1,2 num.data.txt

アルファベット順にソートされたように見えるデータがある場合:

1 1000
1 50
2 9
3 0

これは2つの列のみがあるのと同じですがsort -n -k1,2 num.data.txt(同じ結果を提供する)、実際に作業しているデータにはより多くの列があります。sort -n num.data.txt

2つの方法の間になぜこれらの違いがありますか?

答え1

主な-k1,2仕様の指定一つキーは最初の列の先頭から始まり(デフォルトの列区切り文字は空白ではなく空白から空白への遷移であるため、先頭の空白を含む)、2番目の列の終わりで終わります。

これが単なるものであることに気づくことが重要です。一つキー。 2つのキーが必要な場合は、2つの-kオプションが必要です。並べ替えると、文字列は数値と比較されsortます。数値比較では、これらの文字列は有効な数値のように見える先行部分を考慮して数値に変換されます(先行スペースは無視されます)。だから私たちはとを比較します。同じので、代替ソートを元に戻して、行全体の語彙比較である関係を決定します。"1 50""1 1000"11sort

と比較して次の-n -k1,1 -k2,2同点なので、2番目のキー(vs)を考えます。これは、数値ソート(最初のフィールドで始まり行の最後で終わるキーを指定した場合は行全体と同じ)であるために機能します。sort"1""1"" 50"" 1000"-n -k1 -k2-k1

関連情報