这是我的文件,第一行不是其中的一部分(带有 的行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
GNU 实用程序通常能够将单字母选项解析为单个连字符引导的组,这样
-n -r
也可以作为-nr
;发送仅当不存在nr
可能被误认为的选项时才会出现这种情况。使用
-k 4 -n -r
sort 告诉您要对字段 4 进行排序,并且您希望文件中的每一行都按相反的数字顺序排序。一旦排序完成,5
根据相等的键值对两个 -key 行进行排序,它就会对整个行进行排序,由手册页:最后,作为所有键比较相等时的最后手段,sort 会比较整行,就好像没有指定除 --reverse (-r) 之外的排序选项一样。
...这就是为什么玛丽然后出现在达美航空之前。
当您改为使用 时-k4nr
,您告诉 sort 使用字段 4 并仅以相反的数字顺序对该字段进行排序。当排序完成比较 5 和 5 时,它会按正常字典顺序对这两(整)行进行排序(因为这里没有全局r
verse 选项),因此 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 开头的行将首先出现。