Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 空列的GNU排序不一致行为_Bash_Sorting_Gnu Sort - Fatal编程技术网

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非常感谢!