按行对文件进行排序,无论其内容如何

按行对文件进行排序,无论其内容如何

我有一个非常大的文件,我想按字母顺序排序。它是一个制表符分隔的文件,但我确实需要确保该文件是按行中的第一个字符开始排序的,无论它是空格还是其他任何字符。

输入文件示例:

2090802 V19 I must be the third in the group 
20908 02    V18 I must be the first in file, as col 1 is another value
2090802 V17 I must be the second in the group 
2090802 V16 I must be the first in the group of 2090802

使用命令sort test.txt > test-s.txt我得到这个输出:

2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group 
20908 02    V18 I must be the first in file, as col 1 is another value
2090802 V19 I must be the third in the group 

排序程序似乎看到第一列具有相同的值(忽略第 3 行中的空格),并使用下一个列(V16、V17、V18 和 V19)对文件进行排序。

但是,我希望该值20908 02被认为是不同的,我的预期结果应该是这样的:

20908 02    V18 I must be the first in file, as col 1 is another value
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group 
2090802 V19 I must be the third in the group 

我尝试使用-b参数,并-t给出另一个分隔符,但仍然没有得到想要的结果。

如何通过考虑行中的每个字符而不忽略空格来对文件进行排序?

答案1

排序顺序取决于区域设置。在大多数语言环境中,在第一个近似中会忽略间距(请参阅空格 (U+0020) 和 TAB (U+0009)IGNORE作为前 3 个权重ISO1465)。

如果您想要每个字符(实际上是字节)都计数并且顺序基于字节值的排序顺序(对于 UTF-8 编码文本,这与基于 Unicode 代码点值的排序一致),请使用C又名POSIX区域设置:

LC_ALL=C sort your-file

设置LC_ALL影响全部本地化类别。排序顺序受类别影响LC_COLLATE,但在这里,设置LC_CTYPE(影响字符和字节序列编码/解码的方式)可能C是一个好主意,因为它保证任何字节序列都可以解码为字符并排序(按字节)价值)。如果还设置了其他方式,LC_COLLATE=C sort your-file也将不起作用。LC_ALL

答案2

虽然使用LC_ALL=C可能会更快、更高效,但另一种选择是使用-k告诉sort仅对第一个字段进行排序,而不是其他字段:

$ sort -k1,1 file
20908 02    V18 I must be the first in file, as col 1 is another value
2090802 V16 I must be the first in the group of 2090802
2090802 V17 I must be the second in the group 
2090802 V19 I must be the third in the group 

相关内容