GNU对空列的排序行为不一致

时间:2019-02-15 17:23:20

标签: bash sorting gnu-sort

我正在使用sort(GNU coreutils,版本8.4)实用程序通过前五列对文件进行排序,所有前五列都是数字,并用制表符分隔。为此,我使用以下呼叫:

sort --field-separator=$'\t' -nk1 -nk2 -nk3 -nk4 -nk5 myFileUnsorted.bcp >  myFileSorted.bcp

这在大多数情况下都可以正常工作,但是当有空值时,我会出现一些(看似)不一致的行为。在我的特定情况下,第三(和第四)列中的条目为空,我希望排序后的结果是这样的:

...
1   2           0   ...
1   2           84  ...
1   2           168 ...
...

但是在我的输出文件中,我得到以下命令:

1   2           0   ...
1   2   1       0   ...
1   2   1       84  ...
...
1   2   64      168 ...
1   2           84  ...
1   2           168 ...

不管在第三(/第四)列中包含空值的条目应该放在开头还是结尾,我都希望它们可以放在一起。

在一个十六进制编辑器(带有vim的{​​{1}}版本7.4)中查看有问题的三行内容:

:%!xxd

这使我相信空列中没有特殊的,不可见的字符可能会导致它们彼此分开。

有人知道为什么31 09 32 09 09 09 30 09 ... 31 09 32 09 09 09 38 34 09 ... 31 09 32 09 09 09 31 36 38 09 ... 以这种方式对行进行排序吗?是否可以按照我的第一个示例/预期输出中的方式安排它们?预先感谢!

我正在使用sort(GNU bash,版本4.1.2(1)-发行版(x86_64-redhat-linux-gnu)),并尝试过bash(AJM 93u +版)如果有任何不同,也会产生相同的结果。

1 个答案:

答案 0 :(得分:2)

通过使用-nk3,您告诉sort对从第三列开始的值进行排序,但是您没有告诉它们它们的结束位置,因此它使用了剩下的整行作为值。

要仅使用特定列,请使用

-nk3,3

实际上,对于所有我不想包括行其余部分的列,我都会使用相同的符号。

sort --field-separator=$'\t' -nk1,1 -nk2,2 -nk3,3 -nk4,4 -nk5,5 \
    myFileUnsorted.bcp > myFileSorted.bcp