ソート(デフォルトオプションと数値オプションの違い -n)

ソート(デフォルトオプションと数値オプションの違い -n)

マニュアルページによると、sortコマンドの--numeric-sortオプションの説明は次のとおりです。

-n, --numeric-sort
              compare according to string numerical value

文字列数値とは、各文字列文字のASCII値を連続的に比較することを意味すると仮定しますか?

情報ページを読む

‘-n’
‘--numeric-sort’
‘--sort=numeric’
     Sort numerically.  The number begins each line and consists of
     optional blanks, an optional ‘-’ sign, and zero or more digits
     possibly separated by thousands separators, optionally followed by
     a decimal-point character and zero or more digits.  An empty number
     is treated as ‘0’.  The ‘LC_NUMERIC’ locale specifies the
     decimal-point character and thousands separator.  By default a
     blank is a space or a tab, but the ‘LC_CTYPE’ locale can change
     this.

     Comparison is exact; there is no rounding error.

     Neither a leading ‘+’ nor exponential notation is recognized.  To
     compare such strings numerically, use the ‘--general-numeric-sort’
     (‘-g’) option.

両方の文書を読み取った後でも、-n オプションで使用される照合順序の明確な説明はまだ表示されません。

--numeric-sortオプションはデフォルトオプションとどう違うのですか?私の無邪気な推測は、数字が文字よりも優先されるということです。しかし、ドキュメントではこれを読んでいません。

これを明確に説明する文書は何ですか?つまり、ドキュメントを参照してこの情報をどこで見つけることができますか?

答え1

数字が複数ある場合はsort -n考慮してください。みんな番号;デフォルトでは、このファイル

3
2
1
20
30

次のようにソートされます。

1
2
20
3
30

これはあなたが望むものではないかもしれません。を使用すると、-n次のようになります。

1
2
3
20
30

数値ソートでは、負数、小数点、および千単位の区切り文字(ロケールによって決まります)も処理します。後ろに「数字以外の」テキストがある場合は、ソート順では無視されます。行スタート数値以外のコンテンツの場合、その行はゼロとしてカウントされます。

より正確には、ロジックは次のようになります。 (デフォルト)ソートキーは次のとおりです。初期数値文字列。 (つまり、「各行で数字が始まります」)文字列は、空白、マイナス記号、0個以上の数字、そしておそらく.そして,(または他のもの)。末尾の文字は考慮されません。「数字」の一部ではありません。。行が数字で始まらない場合は、次のように処理されます。見えない("空") 0 と同じ数です。 (または「数字がゼロの数字」)

したがって、「数字」をソートした後(与えられたソートキーを使用して比較-k)、残りの行がある場合はその行をソートします。デフォルトのソートの使用。 (つまり、1a以前1b1a20以前です1a3。)みんな行はこのようにソートされますが、ソートキー以外の行はソートされません。この場合、奇妙な動作が発生します(0cookiessort今後 biscuits- 2次ソートの場合、「見えない0」は追加されません。

通常、-n数値で構成される行(またはフィールド)をソートしたい場合に使用されます。数値以外の項目が多い場合、または数値が他の文字列と混在している場合でも、一貫した結果を得ることができますが、目的の結果ではない可能性があります。

好みの文字と数字(そして両方を含む行)を混在させると、-V次のようになります。バージョンの並べ替え~によると特別なルール文字列を論理コンポーネントに分割します。しかし、これを行うには注意してください。1.10 高い比較する1.9

答え2

デフォルトでは、sort文字はロケールで指定されたソート順を使用してソートされます。通常、これはASCIIシーケンスと非常によく似ていますが、地域的に若干の違いがある可能性があります。マニュアルページから:

***  WARNING  ***  The  locale  specified  by the environment affects sort order.
Set LC_ALL=C to get the traditional sort order that uses native byte values.

デフォルトのバイト値は通常ASCII値を表すため、数字は大文字の前に、大文字は小文字の前に続きます。ただし、ソートはまだ文字ごとに行われるため、最初に表示されます10212

-norオプションを指定すると、--numeric-sort連続した数字は単一の文字ではなく数字として扱われ、数字に応じて最小値から最大値までソートされます。

文書には詳細が完全には明確ではないため、実験から派生したフラグ付け規則は次のとおりです-n

  1. 数字で始まる行は数字でソートされます(小さい数字から)
  2. 数字の行の末尾の文字は数字の部分には影響しませんが、数字の部分が等しい場合は、末尾の文字は英数字でソートされます。
  3. 数字以外で始まる行はゼロでソートされ、次にルール2でソートされます。

観察する:

$ printf %s\\n 2z 111 10 20b 20a aa2 aa10 | sort -n
aa10
aa2
2z
10
20a
20b
111

規則3によれば、行のaa10合計はaa2ゼロとして処理され、残りの文字(文字として扱われる数値を含む)に基づいてソートされます。

規則2によると、行、2zおよび20a20b数字として扱われ、末尾の文字は数字が同じ場合にのみ適用されます。

規則 1 によれば、数字で始まるすべての行は数字順にソートされます。

フラグがない場合は、文字で-nソートが行われ、数字はアルファベット文字の前に続きます。観察する:

$ printf %s\\n 2z 111 10 20b 20a aa2 aa10 | sort
10
111
20a
20b
2z
aa10
aa2

関連情報