AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 477998
Accepted
Draconis
Draconis
Asked: 2018-10-27 08:32:47 +0800 CST2018-10-27 08:32:47 +0800 CST 2018-10-27 08:32:47 +0800 CST

为什么排序说 ɛ = e?

  • 772

ɛ(“拉丁 epsilon”)是某些非洲语言中使用的字母,通常表示英语“bed”中的元音。在 Unicode 中,它被编码为 U+025B,与 daily 非常不同e。

但是,如果我sort如下:

eb
ed
ɛa
ɛc

似乎sort考虑ɛ和e等效:

ɛa
eb
ɛc
ed

这里发生了什么?有没有一种方法可以为目的而制作ɛ和e区分?sort

sort locale
  • 3 3 个回答
  • 4410 Views

3 个回答

  • Voted
  1. Best Answer
    Stéphane Chazelas
    2018-10-27T11:38:35+08:002018-10-27T11:38:35+08:00

    不,它不认为它们是等效的,它们只是具有相同的主要权重。因此,在第一个近似值中,它们的排序相同。

    如果您在 GNU 系统(此处使用 glibc 2.27)上查看 /usr/share/i18n/locales/iso14651_t1_common (用作大多数语言环境的基础),您会看到:

    <U0065> <e>;<BAS>;<MIN>;IGNORE # 259 e
    <U025B> <e>;<PCL>;<MIN>;IGNORE # 287 ɛ
    <U0045> <e>;<BAS>;<CAP>;IGNORE # 577 E
    

    e,ɛ并且E具有相同的主要权重e和E相同的次要权重,只有第三个权重可以区分它们。

    比较字符串时,sort(strcoll()标准的 libc 函数用于比较字符串)首先比较所有字符的主要权重,如果字符串与主要权重相等,则仅使用第二个权重(以此类推其他权重) .

    这就是在第一个近似值的排序顺序中似乎忽略大小写的方式。在andAb之间排序,但可以根据语言规则在之前或之后排序(有些语言在英国英语中之前有,有些在爱沙尼亚语中之前有)。aaacAbab<MIN><CAP><CAP><MIN>

    如果e具有与 相同的排序顺序ɛ,则printf '%s\n' e ɛ | sort -u仅返回一行。但作为<BAS>前排<PCL>,e单独前排 ɛ。eɛe排序后EEE(在次要权重),即使EEE排序后eee(为此我们需要上升到第三个权重)。

    现在,如果在我的系统上使用 glibc 2.27,我运行:

    sed -n 's/\(.*;[^[:blank:]]*\).*/\1/p' /usr/share/i18n/locales/iso14651_t1_common |
      sort -k2 | uniq -Df1
    

    您会注意到有相当多的字符被定义为完全相同的 4 个权重。特别是,我们的 ɛ 具有与以下相同的权重:

    <U01DD> <e>;<PCL>;<MIN>;IGNORE
    <U0259> <e>;<PCL>;<MIN>;IGNORE
    <U025B> <e>;<PCL>;<MIN>;IGNORE
    

    果然:

    $ printf '%s\n' $'\u01DD' $'\u0259' $'\u025B' | sort -u
    ǝ
    $ expr ɛ = ǝ
    1
    

    这可以看作是 GNU libc 语言环境的一个错误。在大多数其他系统上,语言环境确保所有不同的字符最终具有不同的排序顺序。在 GNU 语言环境中,情况变得更糟,因为有数千个字符没有排序顺序并最终排序相同,从而导致各种问题(例如中断comm、join或ls具有不确定顺序的全局... ),因此建议使用LC_ALL=C来解决这些问题。

    正如@ninjalj 在评论中指出的那样,2018 年 8 月发布的 glibc 2.28 在这方面进行了一些改进,尽管 AFAICS 仍然有一些字符或排序元素定义为相同的排序顺序。在带有 glibc 2.28 和 en_GB.UTF-8 语言环境的 Ubuntu 18.10 上。

    $ expr $'L\ub7' = $'L\u387'
    1
    

    (为什么 U+00B7 仅在与L/结合时才被视为等同于 U+0387 l?!)。

    和:

    $ perl -lC -e 'for($i=0; $i<0x110000; $i++) {$i = 0xe000 if $i == 0xd800; print chr($i)}' | sort > all-chars-sorted
    $ uniq -d all-chars-sorted | wc -l
    4
    $ uniq -D all-chars-sorted | wc -l
    1061355
    

    (仍然有超过 100 万个字符(Unicode 范围的 95%,低于 2.27 中的 98%)排序与其他字符相同,因为它们的排序顺序未定义)。

    也可以看看:

    • “LC_ALL=C”有什么作用?
    • 生成字符串的整理顺序
    • “sort -u”和“sort | uniq”有什么区别?
    • 68
  2. Ipor Sircer
    2018-10-27T08:35:19+08:002018-10-27T08:35:19+08:00

    男人排序:

       ***  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.
    

    所以,试试:LC_ALL=C sort file.txt

    • 15
  3. jimmij
    2018-10-27T09:34:27+08:002018-10-27T09:34:27+08:00

    字符 ɛ 不等于 e,但某些语言环境可以在整理时将这些符号聚集在一起。其原因是特定于语言的,但也有一些历史甚至政治背景。例如,大多数人可能期望欧元货币在字典中接近欧洲。

    无论如何,要查看您当前使用locale的排序规则,locale -a它将为您提供系统上可用的语言环境列表,并将排序规则更改为C仅用于一次排序运行LC_COLLATE=C sort file。最后看看不同的语言环境如何对您的文件进行排序尝试

    for loc in $(locale -a)
        do echo ____"${loc}"____
        LC_COLLATE="$loc" sort file
    done
    

    将结果传送到一些 greping 工具以选择适合您需要的语言环境。

    • 8

相关问题

  • 数字排序无法正确排序文件

  • Arch Linux:设置语言环境失败。修复你的系统

  • 如何对文件中每个日期的行数进行排序?

  • 列出根据特定内容行排序的文件

  • 读取带有单词的文本文件及其出现次数和排序的打印输出

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve