Linux排序与Perl字符串比较

4
因为我处理的是非常大的文件,所以在比较之前,我会先对基础文件和候选文件进行排序,以查看另一个文件中缺少哪些行。我这样做是为了避免将记录保存在内存中。排序是使用Linux命令行工具sort完成的。
在我的Perl脚本中,我会查看该行中的字符串是否小于、大于或等于另一个文件中的行,并在必要时推进文件的指针。然而,当我注意到我的字符串比较认为基础文件中的字符串小于候选文件中包含特殊字符的字符串时,我遇到了问题。
有没有一种可靠的方法来确保我的Linux sort和Perl字符串比较使用相同类型的字符串比较器?

5
你看过join或者comm了吗?如果你只需要看一下哪些行在另一个文件中不存在,那么它们应该可以胜任。 - Daniel Gallagher
@Daniel的建议很好 - 听起来你基本上已经用Perl编写了comm :) 有趣的是,comm手册没有提到locales,所以它可能会像你的Perl脚本一样出现问题。 - j_random_hacker
1个回答

8

sort命令使用由环境变量LC_ALL指定的当前语言环境来确定字符的排序顺序。通常,解决排序问题的最简单方法是手动将其设置为C语言环境,这将把每个8位字节视为一个单独的字符,并按简单的数值进行比较。在大多数shell中,可以通过以下方式为单个命令临时设置:

LC_ALL=C sort < infile > outfile

这也将解决其他一些文本处理程序的类似问题。(例如,我记得在一个德国人的电脑上处理CSV文件时出现了问题——这是因为德国人使用逗号代替小数点。在相关命令前添加LC_ALL=C也可以解决此问题。)
[编辑]尽管Perl可以指示将某些字符串视为Unicode,但默认情况下仍将输入和输出视为8位字节流,因此以上方法应产生与Perl的sort()函数相同的顺序。(感谢Ven'Tatsu提供的信息。)

2
过于简化的说,为了向后兼容,默认情况下所有输入输出都是以字节流的形式处理,除非通过指定Perl编程语言进行更改。命令行选项、编译指示、IO层和编码函数可以将一些数据标记为Unicode,或者对某些操作或句柄应用特定的编码行为。 - Ven'Tatsu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接