GNU 排序空列的不一致行为

GNU sort inconsistent behaviour for empty columns

我正在使用 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 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 以这种方式对行进行排序?是否可以按照我的第一个 example/expected 输出中的方式排列它们?提前致谢!

我正在使用 bash(GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu))并尝试过 ksh(版本 AJM 93u+),两者都产生了相同的结果,如果这有什么不同的话。

通过使用 -nk3,您告诉 sort 对从第三列 开始的值 进行排序,但您没有告诉它它们在哪里结束,所以它使用整个剩余行作为值。

要仅使用特定列,请使用

-nk3,3

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

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