web-dev-qa-db-ja.com

Linuxソートのデフォルトの順序は何ですか?

長い間、私はsortプログラムのデフォルトの動作がASCII orderを使用していると思っていました。ただし、次の行をsortに引数なしで入力すると:

#
@

私は得ました:

@
#

しかし、ASCIIテーブルによると、#は35、@は64です。別の例は次のとおりです。

A
a

そして出力は:

a
A

誰かがこれを説明できますか?ところで、sort -dを使用する場合の「辞書順」とは何ですか?

21
old_bear

POSIX以外のロケールを使用しているようです。

試してください:

export LC_ALL=C

そしてsort

info sort明確に言う:

(1)非POSIXロケールを使用する場合(たとえば、「LC_ALL」を「en_US」に設定することにより)、「sort」は、慣れている方法とは異なる方法でソートされた出力を生成する場合があります。その場合、「LC_ALL」環境変数を「C」に設定します。 `LC_COLLATE 'だけを設定すると2つの問題があることに注意してください。まず、 `LC_ALL 'も設定されていると効果がありません。第二に、 `LC_CTYPE '(または` LC_CTYPE'が設定されていない場合は `LANG ')が互換性のない値に設定されている場合、動作は未定義です。たとえば、「LC_CTYPE」が「ja_JP.PCK」であるが「LC_COLLATE」が「en_US.UTF-8」である場合、未定義の動作が発生します。

19
codaddict

man sortが言うように、「辞書順」は「空白と英数字のみを考慮する」ことを意味します。たとえば、与えられたデータ

The
!quick
brown
@fox
jumps
#over
17
$lazy
  dogs
%42
times.

装飾されていないsortコマンドは

  dogs
!quick
#over
$lazy
%42
@fox
17
brown
jumps
The
times.

(スペース文字と!#$%、および@記号で始まる行を置く1 文字と数字で始まる行の前。つまり、英数字)ですが、sort -d

  dogs
17
%42
brown
@fox
jumps
$lazy
#over
!quick
The
times.

  dogsは、スペースで始まるため、最初ですが、特殊(句読点)文字は無視されます。 17foxの前に通常は42の前に移動する文字があるにもかかわらず、4217の前にあり、brownjumpsfoxの間にあります。
____________
1 ASCII値の順番:space = 040、! = 041、# = 043、$ = 044、% = 045、@ = 0100。この(スペースバーを無視して)一部のキーボードでは、左から右の順序です。

ソート順を決定するには、各行に異なる文字を含むファイルを作成し、それをソートします。結果の出力は、ソート順を示します。

3
Gabe