Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
在unix中,以下三个排序命令之间有什么区别?_Unix_Sorting - Fatal编程技术网

在unix中,以下三个排序命令之间有什么区别?

在unix中,以下三个排序命令之间有什么区别?,unix,sorting,Unix,Sorting,unix中的以下排序命令有何不同 1) sort -k1,4 < file 2) sort -k1,1 -k4,4 < file 3) sort -k1,1 -k2,2 -k3,3 -k4,4 < file 但我不明白这个解释。如果它从POS1开始并在POS2结束,那么上面的#1和#3命令不应该产生相同的结果吗?不同之处在于#1将整行视为一个键,并按字典顺序进行排序。另外两个有多个键,特别是当#3使用与#1相同的字段集时,它使用的方式非常不同。它首先按第一列对列表进行排序(空

unix中的以下排序命令有何不同

1) sort -k1,4 < file
2) sort -k1,1 -k4,4 < file
3) sort -k1,1 -k2,2 -k3,3 -k4,4 < file
但我不明白这个解释。如果它从POS1开始并在POS2结束,那么上面的#1和#3命令不应该产生相同的结果吗?

不同之处在于#1将整行视为一个键,并按字典顺序进行排序。另外两个有多个键,特别是当#3使用与#1相同的字段集时,它使用的方式非常不同。它首先按第一列对列表进行排序(空格属于以下字段,除非您指定
-b
),否则空格是有效的),如果两行或更多行在第一列中具有相同的值,则它使用第二个键对该行子集进行排序。如果前两列中有两行或多行相同,则使用第三个键,以此类推

在第一种情况下,根据您的区域设置,您可以得到不同的结果(尝试
LC\u ALL=C sort-k1,4
,并将其与例如
LC\u ALL=en\u US.utf8 sort-k1,4
进行比较)

在第二种和第三种情况下,由于键在从非空白到空白的转换中被拆分。这意味着第二列和后面的列具有大小不同的空格前缀,这会影响排序顺序,因为您没有指定
-b

此外,如果你有一个混合的空格和标签来排列你的列,这可能会弄乱事情


当我在我的环境中使用
LC_ALL=en_US.utf8
时,我得到了与您相同的结果,但使用
LC_ALL=C
(SuSE Enterprise 11.2)得到了您的预期结果(即无差异)。

除了不使用
diff-u
之外,还提供了漂亮的示例!我无法重现你的结果。我使用GNU排序和NetBSD排序从命令#1和#3获得相同的输出。您使用的是什么版本的排序?这可能是一个bug.++对于解释和有趣的问题,我之前的评论是这样的:我相信特瓦尔伯格的回答最有可能解释你和我的分类之间的差异。地区。任何足够高级的依赖于语言环境的行为都无法与bug区分开来。这是由于twalberg提到的
LC#u ALL
中的差异造成的,当我使用
LC#u ALL=C
时,1和3之间没有区别。我的unix排序版本是GNU coreutils 8.4,不幸的是,拆分并没有丢弃空格。每个字段都包含其前面的空格,除非添加
b
标志<代码>排序
的行为远远不是直观的(而且地区会让事情变得更糟)是的,我只是在读那部分。。。做了一些改变来解释我自己刚学到的东西。。。
$ cat tmp
1       2       3       t
4       2       4       c
5       4       6       c
7       3       20      r
12      3       5       i
2       45      7       a
11      23      53      b
23      43      53      q
11      6       3       c
0       4       3       z

$ diff <(sort -k1,4 tmp) <(sort -k1,1 -k2,2 -k3,3 -k4,4 tmp)
1a2
> 1     2       3       t
5,6d5
< 1     2       3       t
< 23    43      53      q
7a7
> 23    43      53      q

$diff <(sort -k1,4 tmp) <(sort -k1,1 -k4,4 tmp)
1a2
> 1     2       3       t
5,6d5
< 1     2       3       t
< 23    43      53      q
7a7
> 23    43      53      q
-k, --key=POS1[,POS2]
 start a key at POS1 (origin 1), end it at POS2 (default end of line)