我正在尝试按其 Unicode 值对文本文件进行逐行排序。据我所知,这意味着首先是数字,然后是字母,然后是 CJK 表意文字。然而,sort
(with LC_ALL=C
) 在这个任务上失败了。这是我的清单的摘录:
[#??????????]
[???????]
[??]
...
[?????????????]
[?????????????]
[10th Avenue Cafe]
[2nd Flush]
...
[Alstroemeria Records & Cradle]
[ALTERNATIVE]
[???????? - Altneuland]
[Amateras Records]
[???????Ammy's]
[anagram]
[Analyze]
...
[Z.S.G TRAXXX]
[? music]
[?iselied]
[?????????]
[???]
Run Code Online (Sandbox Code Playgroud)
似乎sort
忽略(至少有时)它无法读取的字符,因为Altneuland
确实会在Alternative
和之间Amateras Records
。使用有人建议msort
(有选项,但它也失败了-u c
,-u d
和-u n
分别)。
首先,为什么它表现得如此出乎意料?其次,我该如何解决这个问题?
添加:// 我在树莓派上使用 Raspbian (B)
你用的是什么系统?
LC_ALL=C sort < your-file.txt
Run Code Online (Sandbox Code Playgroud)
your-file.txt
您以 utf-8 编码发布的文本在哪里,排序为:
[#??????????]
[10th Avenue Cafe]
[2nd Flush]
[ALTERNATIVE]
[Alstroemeria Records & Cradle]
[Amateras Records]
[Analyze]
[Z.S.G TRAXXX]
[anagram]
[? music]
[?iselied]
[??]
[?????????????]
[???????? - Altneuland]
[?????????????]
[???????Ammy's]
[???????]
[?????????]
[???]
Run Code Online (Sandbox Code Playgroud)
在我的系统上(从 GNU coreutils 8.13、Debian EGLIBC 2.13-38 排序)。当通过管道传递cut -c2 | tr -d \\n | recode ..dump
给:
UCS2 Mne Description
0023 Nb number sign
0031 1 digit one
0032 2 digit two
0041 A latin capital letter a
0041 A latin capital letter a
0041 A latin capital letter a
0041 A latin capital letter a
005A Z latin capital letter z
0061 a latin small letter a
03B1 a* greek small letter alpha
042F JA cyrillic capital letter ya
305E zo hiragana letter zo
307B ho hiragana letter ho
30A2 A6 katakana letter a
30B5 Sa katakana letter sa
30BB Se katakana letter se
30C1 Ti katakana letter ti
4E00
4E03
Run Code Online (Sandbox Code Playgroud)
与sort
来自 GNU coreutils 7.4、EGLIBC 2.11.1-0ubuntu7.12的旧系统相同