为什么“排序”会忽略特殊字符,例如星号?

Aar*_*lla 32 sorting

我认为这sort会将常见的前缀排序在一起,但这并不总是发生。以这个输入为例:

AT0S*eightieths
AT0S*eyetooth's
AT*ad
AT*Ad
AT*AD
AT*Eydie
AT*eyed
ATF*adv
ATF*ATV
ATF*edify
ATF*Ediva
ATFKT*advocate
ATFKTNK*advocating
ATFKT*outfought
ATFKTS*advocates
ATHT*whitehead
ATHT*Whitehead
AT*id
AT*I'd
AT*Ito
AT*IUD
ATJ*adage
ATNXNS*attention's
ATNXNS*attenuation's
ATNXNS*autoignition's
AT*oat
AT*OD
AT*outweigh
AT*owed
ATP0K*idiopathic
ATP*adobe
ATT*wighted
ATT*witted
ATT*wooded
AT*UT
AT*Uta
AT*wowed
AT*Wyatt
ATX*atishoo
Run Code Online (Sandbox Code Playgroud)

之后sort,我希望所有的AT*最终都集中在一个块中,但是当您通过 运行此数据时sort,输出==输入。这是为什么?我没有指定任何选项来忽略非字母字符或任何东西。只是sort dict > out

我的版本sort来自coreutils 8.5-1ubuntu3.

小智 23

在我的情况下,设置 LC_ALL=C 恢复了传统的排序顺序。包:coreutils 版本:8.5-1ubuntu3

export LC_ALL=C 
Run Code Online (Sandbox Code Playgroud)

  • 无需`export`,甚至不需要设置本地,可能会弄乱其他东西。只需在 sort 调用中设置它:`LC_ALL=C sort`。例如`echo -e 'a\n*\n*b\nc' | LC_ALL=C sort`, LC_ALL在调用sort之外不会改变 (4认同)
  • `LC_COLLATE` 是特定于 `sort` 等的设置。 (3认同)

小智 22

sort --version-sort filename 
Run Code Online (Sandbox Code Playgroud)

这保留了数字的自然顺序。

  • +1 那行得通,但为什么呢?文本中只有几个个位数。 (4认同)
  • 无需改变环境即可工作,+1 (2认同)

Wal*_*alf 5

根据其他人的评论提供一个简单的答案,这不会改变您的环境:

input_program | LC_COLLATE=C sort | output_program
Run Code Online (Sandbox Code Playgroud)

或者

LC_COLLATE=C sort < input_file > output_file
Run Code Online (Sandbox Code Playgroud)

或其组合。