我有一个非常大的文件,我想按字母顺序排序。它是一个制表符分隔的文件,但我确实需要确保该文件是按行中的第一个字符开始排序的,无论它是空格还是其他任何字符。
输入文件示例:
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