Linux排序与Perl字符串比较

syk*_*ker 4 sorting string perl

因为我正在处理非常大的文件,所以我在比较它们之前对基础文件和候选文件进行了排序,以查看另一条文件中缺少的行.我这样做是为了避免将记录保存在内存中.排序是使用Linux命令行工具sort进行的.

在我的Perl脚本中,我会查看该行中的字符串是否为lt,gt或eq到另一个文件中的行,并在必要时推进文件中的指针.但是,当我注意到我的字符串比较认为基本文件中的字符串是包含特殊字符的候选文件中的字符串时,我遇到了问题.

是否有一种确定的方法可以确保我的Linux排序和Perl字符串比较使用相同类型的字符串比较器?

j_r*_*ker 8

sort命令使用环境变量指定的当前语言环境LC_ALL来确定字符的排序顺序.通常,修复排序问题的最简单方法是手动将其设置为C语言环境,该语言环境将每个8位字节视为单个字符,并通过简单的数值进行比较.在大多数shell中,这可以作为一个单独的命令来完成,通过为它添加前缀:

LC_ALL=C sort < infile > outfile
Run Code Online (Sandbox Code Playgroud)

这也将解决其他一些文本处理程序的类似问题.(例如,我记得在德国人的计算机上处​​理CSV文件的问题 - 这可以追溯到德国人使用逗号而不是小数点这一事实.LC_ALL=C在相关命令前面放置了这个问题.)

[编辑]虽然可以指示Perl将某些字符串视为Unicode,但默认情况下它仍然将输入和输出视为8位字节的流,因此上述方法应该生成与Perl sort()函数相同的顺序.(感谢Ven'Tatsu这个金块.)

  • 过度简化:为了向后兼容,默认情况下仍然是输入或输出的所有内容都是字节流,直到Perl被告知.命令行选项,编译指示,IO层和编码函数可以将某些数据标记为Unicode,或将特定于编码的行为应用于某些操作或句柄. (2认同)