使用sort -k linux

时间:2014-11-28 02:40:53

标签: linux bash sorting unix console

讲师给了我们一个代码:

sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt > distros-by-date.txt

应该按日期对此distros.txt文件进行排序

Fedora:10:11/25/2008
SUSE:11.0:06/19/2008
Ubuntu:8.04:04/24/2008
Fedora:8:11/08/2007
SUSE:10.3:10/04/2007
Ubuntu:6.10:10/26/2006
Fedora:7:05/31/2007
Ubuntu:7.10:10/18/2007
Ubuntu:7.04:04/19/2007
SUSE:10.1:05/11/2006
Fedora:6:10/24/2006
Fedora:9:05/13/2008
Ubuntu:6.06:06/01/2006
Ubuntu:8.10:10/30/2008
Fedora:5:03/20/2006

假设代码有效,这应该是输出的简化版

Fedora 10
Ubuntu 8.10
SUSE 11.0
Fedora 9
Ubuntu 8.04
Fedora 8
Ubuntu 7.10
SUSE 10.3
Fedora 7
Ubuntu 7.04

事情是,它没有工作,我很难找到错误的。我已经读过它,但这些例子只使用 n b r ?,有时候之间也有空格 - k和钥匙,有时不是;最后,有时候在键(3.7)和逗号(3,7)之间有一个点。我尝试阅读手册页,但我无法绕过它,有人可以解释一下吗?

如果这很重要,有时他会使用mac并导致代码出现问题,也许是操作系统?

2 个答案:

答案 0 :(得分:0)

您没有字段分隔符规范来告诉sort它应该使用冒号:

sort -t: -k 3.7nbr -k 3.1nbr -k 3.4nbr

而且,要获得简化的输出,您只需要第一列和第二列,如下面的记录:

$ sort -t: -k 3.7nbr -k 3.1nbr -k 3.4nbr inputfile | awk -F: '{print $1" "$2}'
Fedora 10
Ubuntu 8.10
SUSE 11.0
Fedora 9
Ubuntu 8.04
Fedora 8
Ubuntu 7.10
SUSE 10.3
Fedora 7
Ubuntu 7.04
Ubuntu 6.10
Fedora 6
Ubuntu 6.06
SUSE 10.1
Fedora 5

就标志而言,n表示数字比较,b表示忽略前导空格(大概涵盖像12/ 4/2022这样的情况)和r表示反向顺序(最新最早的。)

答案 1 :(得分:0)

您缺少选项-t:,它将字段分隔符设置为。此外,-k 3.4nbr是多余的,但它不会受到伤害。

手册页中有关-k的内容:

  

KEYDEF是开始和停止位置的F [.C] [OPTS] [,F [.C] [OPTS]],其中F是字段编号,C是字段中的字符位置;两者都是原点1,停止位置默认为行的结束。

这意味着什么:

密钥规范(-k之后的内容)包含一个字段编号(F),可选地([...])后跟一个句点和一个字符偏移量({{1} })和可选的选项字符.C),后面可以跟第二个字段编号和可选的字符偏移量。

如果缺少字符偏移,则键以字段中的第一个字符开头。

第一个字段编号/字符偏移量定义字段的开头。如果有第二个[OPTS],则它定义字段的结尾;否则,该字段将移至该行的末尾。