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