6

我有一个很大的文件,我想按字母顺序排序。这是一个以制表符分隔的文件,但我确实需要确保该文件从行中的第一个字符开始排序,而不管它是空格还是其他任何字符。

输入文件示例:

2090802 V19 I必须是组中的第三个20908 02 V18 I必须是文件中的第一个,因为col 1是另一个值2090802 V17 I必须是组中的第二个2090802 V16 I必须是2090802组中的第一个

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

2090802 V16 I必须是2090802组中的第一个2090802 V17 I必须是组中的第二个20908 02 V18 I必须是文件中的第一个,因为col 1是另一个值2090802 V19我必须是小组中的第三名

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

然而,我想要这个值20908 02我的预期结果应该是:

20908 02 V18 I必须是文件中的第一个,因为col 1是另一个值2090802 V16 I必须是2090802组中的第一个2090802 V17 I必须是组中的第二个2090802 V19 I必须是组中的第三个

我试过了-b条论点,以及-t吨给另一个分离器,但仍然没有得到预期的结果。

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

0

2个答案2

重置为默认值
13

排序顺序取决于区域设置。在大多数区域设置中,在第一近似中忽略间距(请参见空格(U+0020)和TAB(U+0009)IGNORE公司作为中的前3个权重ISO14651标准).

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

LC_ALL=C对文件进行排序

设置LC_全部影响全部的本地化类别。排序顺序受LC_卷轴类别,但在这里,设置LC_类型(影响字符和编码/解码到字节序列的方式)到C类这可能是一个好主意,因为它可以保证任何字节序列都可以解码为字符并进行排序(按字节值)。LC_COLLATE=C对文件进行C排序如果LC_全部否则也会设置。

0
7

使用时LC_ALL=C(全部)可能会更快更高效,另一个选择是使用-k个告诉别人分类只对第一个字段进行排序,而不对其他字段进行排序*:

$sort-k1,1文件20908 02 V18 I必须是文件中的第一个,因为col 1是另一个值2090802 V16 I必须是2090802组中的第一个2090802 V17 I必须是组中的第二个2090802 V19 I必须是组中的第三个

*实际上,分类(或至少GNU分类)当它找到两个相同的排序字段时,仍会查看行的其余部分以进行“last-resort”排序。这在中进行了解释信息排序在GNU系统上:

最后,作为最后的手段,当所有键比较相等时,“sort”对整行进行比较,就好像除了指定了“--reverse”(“-r”)。“--stable”(“-s”)选项禁用此“last-resort比较”,以便比较等于保留其原始相对顺序。“--唯一”('-u')选项还禁用last-resort比较。

正是这种最新的重新排序使V16行出现在输出中V17行之前,尽管输入中的顺序与之相反。

2
  • 它与-k1,1-秒,如果我不需要对行的其余部分进行排序,我想我会使用它。此外,前导空格没有被忽略,它们被组合在一起,这对我来说很好。我必须测试此解决方案是否更快或LC_ALL=C(全部)一个用于大文件-1到2 GB。 4月30日12:46
  • 1
    @TrueSoft,您可以使用LC_ALL=C排序-bsk1,1按第一列排序,忽略前导空格,跳过解码更有效 4月30日12:50

你必须登录来回答这个问题。

不是你想要的答案吗?浏览已标记的其他问题.