Bash 空列的GNU排序不一致行为
我正在使用Bash 空列的GNU排序不一致行为,bash,sorting,gnu-sort,Bash,Sorting,Gnu Sort,我正在使用sort(GNU coreutils,8.4版)实用程序按文件的前五列对文件进行排序,所有这些列都是数字,并用一个选项卡分隔。为此,我使用以下调用: sort --field-separator=$'\t' -nk1 -nk2 -nk3 -nk4 -nk5 myFileUnsorted.bcp > myFileSorted.bcp 这在大多数情况下都很好,但当存在空值时,我会出现一些(似乎)不一致的行为。在我的特定情况下,第三(和第四)列中的条目为空,我希望排序结果如下所示:
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 ...
不管第三列(/第四列)中包含空值的条目应该放在开头还是结尾,我都希望它们放在一起
在hex编辑器中查看有问题的三行(vim
Version7.4 with:%!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
会这样排序吗?是否可以按照我的第一个示例/预期输出中的方式安排它们?提前谢谢
我使用的是
bash
(GNU bash,版本4.1.2(1)-release(x86_64-redhat-linux-GNU)),我也尝试过ksh
(版本AJM 93u+),如果这有什么不同的话,两者都产生了相同的结果。通过使用-nk3
,您告诉排序
从第三列开始对值进行排序,但是您没有告诉它它们的结束位置,所以它使用了整个剩余的行作为值
要仅使用特定列,请使用
-nk3,3
事实上,对于我不想包含行的其余部分的所有列,我都会使用相同的符号
sort --field-separator=$'\t' -nk1,1 -nk2,2 -nk3,3 -nk4,4 -nk5,5 \
myFileUnsorted.bcp > myFileSorted.bcp
这很好地完成了这个技巧,结果我只是没有像我想的那样理解
sort
:D非常感谢!