为什么 sort -k4nr 和 sort -k 4 -n -r 给出不同的结果?

为什么 sort -k4nr 和 sort -k 4 -n -r 给出不同的结果?

这是我的文件,第一行不是其中的一部分(带有 的行Fname ..

Fname Lname Age Children 
John  Doe   61  2
Mary  Jane  32  5
Delta Cross 30  5
Sui   Ace   24  1

我想根据以下内容对该文件进行排序儿童人数。应从最多子项到最少子项排序。

这是我的命令:sort -k 4 -n -r file.txt,它表示根据第四列进行排序、数字排序和反向排序。这产生:

Mary  Jane  32  5
Delta Cross 30  5
John  Doe   61  2
Sui   Ace   24  1

我的文字就是这样做的sort -k4nr file.txt。对此我有两个问题:

首先,我认为我们的选项必须用空格分隔(而不是连接在一起)?难道排序不是这样,或者任何命令都不是这样吗?

其次,当这样做时,我得到了“正确”的顺序,但Delta首先是:

Delta Cross 30  5
Mary  Jane  32  5
John  Doe   61  2
Sui   Ace   24  1

为什么是这样?

答案1

  1. GNU 实用程序通常能够将单字母选项解析为单个连字符引导的组,这样-n -r也可以作为-nr;发送仅当不存在nr可能被误认为的选项时才会出现这种情况。

  2. 使用-k 4 -n -rsort 告诉您要对字段 4 进行排序,并且您希望文件中的每一行都按相反的数字顺序排序。一旦排序完成,5根据相等的键值对两个 -key 行进行排序,它就会对整个行进行排序,由手册页:

    最后,作为所有键比较相等时的最后手段,sort 会比较整行,就好像没有指定除 --reverse (-r) 之外的排序选项一样。

...这就是为什么玛丽然后出现在达美航空之前。

当您改为使用 时-k4nr,您告诉 sort 使用字段 4 并仅以相反的数字顺序对该字段进行排序。当排序完成比较 5 和 5 时,它会按正常字典顺序对这两(整)行进行排序(因为这里没有全局rverse 选项),因此 Delta 排在 Mary 之前。

答案2

根据命令,您可以将选项分组在一起。sort是其中之一,但它也可以更改我将在下面介绍的输出。

这也适用于rm

rm -rf directory做同样的事rm -r -f directory

至于为什么你的两个命令给出不同的顺序,你的第一个命令使用第四列作为键进行排序-k 4,然后继续进行数字排序,然后反转它。 (实际上您不需要,n因为第四列仅包含数字,因此sort -k 4 -r会给出相同的输出)。然后,它以相反的顺序对其余列进行排序。

您的第二个命令将它们组合在一起,然后通过按相反的数字顺序仅对第四列进行排序来进行操作。它们的第四列具有相同的键值,因此它继续按字母顺序对前两列进行排序。

如果你改变这一行:

Delta Cross 30 5

Zelta Cross 30 5

那么第二个命令中以 Mary 开头的行将首先出现。

相关内容