在unix中,以下三个排序命令之间有什么区别?
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相同的字段集时,它使用的方式非常不同。它首先按第一列对列表进行排序(空
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)