我有一个非常大的文件,我想按字母顺序排序。它是一个制表符分隔的文件,但我确实需要确保该文件是按行中的第一个字符开始排序的,无论它是空格还是其他任何字符。
输入文件示例:
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
给出另一个分隔符,但仍然没有得到想要的结果。
如何通过考虑行中的每个字符而不忽略空格来对文件进行排序?
排序顺序取决于区域设置。在大多数语言环境中,间距在第一近似中被忽略(请参阅空格 (U+0020) 和 TAB (U+0009) 如何作为ISO14651
IGNORE
中的前 3 个权重)。如果您想要每个字符(实际上是字节)都计数并且顺序基于字节值的排序顺序(对于 UTF-8 编码文本,这与基于 Unicode 代码点值的排序一致),请使用
C
又名POSIX
区域设置:设置
LC_ALL
影响所有本地化类别。排序顺序受类别影响LC_COLLATE
,但在这里,设置LC_CTYPE
(影响字符和字节序列编码/解码的方式)可能C
是一个好主意,因为它保证任何字节序列都可以解码为字符并排序(按字节)价值)。如果还设置了其他方式,LC_COLLATE=C sort your-file
也将不起作用。LC_ALL
虽然使用
LC_ALL=C
可能会更快、更高效,但另一种选择是使用-k
告诉sort
仅对第一个字段进行排序,而不对其他字段进行排序*:* 实际上,
sort
(或者至少是 GNUsort
)在找到两个相同的排序字段时仍然会查看该行的其余部分以进行“最后的”排序。info sort
GNU 系统对此进行了解释:正是这种最后手段的排序使得 V16 行在输出中出现在 V17 行之前,尽管在输入中的顺序相反。