如何使用LDML文件指定的排序规则在Linux中实现行排序?
方案1:bash sort 实现(优先推荐)
bash 自带的 sort 命令基于系统 glibc 的 locale 规则执行排序,你只需要将 LDML 文件编译为系统可识别的自定义 locale 即可使用:
- 首先安装 locale 编译依赖:
- Debian/Ubuntu 系:
apt install locales icu-devtools - RHEL/CentOS 系:
dnf install glibc-locale-source libicu-devel
- Debian/Ubuntu 系:
- 若你的 LDML 为标准 ICU 格式,先转换为 glibc 兼容的 locale 源文件:
ldml2locale 你的LDML文件路径 ./xxx_YY.UTF-8,其中xxx_YY.UTF-8为你自定义的 locale 名称(xxx为语言ISO码,YY为地区码) - 编译自定义 locale 到本地目录(避免修改系统文件):
localedef -f UTF-8 -i ./xxx_YY.UTF-8 --prefix=./custom_locale xxx_YY.UTF-8 - 临时加载自定义 locale 到当前 shell 会话:
export LOCPATH=./custom_locale/usr/lib/locale export LC_ALL=xxx_YY.UTF-8 - 直接执行排序即可:
sort 待排序文件路径 > 排序后输出文件路径
若需要全局生效,可将编译生成的 locale 文件移动到
/usr/lib/locale/系统路径下,后续无需每次加载环境变量即可直接使用。
方案2:Perl Unicode::ICU::Collator 模块实现
该方案无需修改系统 locale 配置,直接基于 ICU 库加载 LDML 规则完成排序:
- 安装模块依赖:
- 系统包安装(推荐):Debian/Ubuntu 系执行
apt install libunicode-icu-collator-perl - CPAN 安装:
cpanm Unicode::ICU::Collator
- 系统包安装(推荐):Debian/Ubuntu 系执行
- 从 LDML 文件中提取
<collation>节点下的所有排序规则,保存为纯文本规则文件collation_rules.txt - 编写排序脚本
custom_sort.pl:use strict; use warnings; use Unicode::ICU::Collator; # 读取自定义排序规则 open my $rule_fh, '<', 'collation_rules.txt' or die "无法打开规则文件: $!"; my $custom_rules = do { local $/; <$rule_fh> }; close $rule_fh; # 初始化排序器,基于root locale用自定义规则覆盖 my $collator = Unicode::ICU::Collator->new('root', rules => $custom_rules); # 读取输入、排序、输出 my @lines = <STDIN>; my @sorted_lines = $collator->sort(@lines); print @sorted_lines; - 执行排序:
perl custom_sort.pl < 待排序文件路径 > 排序后输出文件路径
标准 LDML 定义的 collation 规则无需修改即可直接被 ICU 库识别,若存在特殊扩展规则可参考 ICU 官方排序规则语法做少量适配即可。
内容的提问来源于stack exchange,提问作者Wes
相关产品推荐
相关产品推荐

