使用sort -k(带2个字段)和-g一样长

时间:2016-07-05 22:06:47

标签: sorting unix command-line

这就是我正在做的事情

sort -k 1,2 -g temp2

我正在

hs1 154800000   247249719   3
hs1 27800000    120700000   4
hs1 27800000    124300000   4
hs3 32100000    71800000    9
hs3 32100000    87200000    2
hs3 54400000    74200000    15
hs4 76500000    155100000   20
hs4 76500000    182600000   3
hs4 76500000    88200000    77
hs4 88200000    124000000   2
hs5 58900000    180857866   8
hs5 58900000    76400000    2
hs5 58900000    97300000    4
hs5 76400000    143100000   14
hs5 97300000    147200000   6
hs6 63500000    70000000    73
hs6 63500000    92100000    4
hs6 7000000 29900000    2
hs6 70000000    113900000   70
hs6 70000000    139100000   57
hs6 92100000    113900000   3

但我希望第二个字段中的较大数字低于较小的数字

例如,我希望前三行是

hs1 27800000    120700000   4
hs1 27800000    124300000   4
hs1 154800000   247249719   3

而不是

hs1 154800000   247249719   3
hs1 27800000    120700000   4
hs1 27800000    124300000   4

2 个答案:

答案 0 :(得分:2)

-k 1,2并不意味着使用两个键(字段1和2)进行排序。它意味着使用由字段1和2的内容组成的单个键进行排序。使用数字排序时,这根本不起作用。事实上,你可以看到使用--debug正在做什么决定像hs1 154800000 这样的值根本不是有效数字(因为它们不是),并且忽略你提供的密钥。您所看到的是“后备排序”的结果,它在整行上进行了字母排序,以打破具有相同键值的行之间的联系。

其中一项工作是什么:

sort -k 1,1 -k 2,2g temp2
sort -k 1,1.2 -k 1.3,1g -k 2,2g temp2

通过使用多个-k选项,我们可以获得多个排序键。

在第一种情况下,-k 1,1按字母顺序排序第一个字段,-k 2,2g按数字排序第二个字段。

在第二种情况下,-k 1,1.2按字母顺序按第一个字段的前两个字符排序; -k 1.3,1g按第一个字段的其余部分进行数字排序,-k 2,2g按第二个字段进行数字排序。

两个选项为您的样本输入生成相同的输出,因为前两个字符始终为hs且没有多位数字,但正确的选择取决于您在其他情况下要发生的事情。

答案 1 :(得分:1)

-k选项是一个字段范围。使用其中两个,并在需要的地方包含常规数字选项:

% sort -k1,1 -k2,2g temp2
hs1 27800000    120700000   4
hs1 27800000    124300000   4
hs1 154800000   247249719   3
hs3 32100000    71800000    9
hs3 32100000    87200000    2
hs3 54400000    74200000    15
hs4 76500000    155100000   20
hs4 76500000    182600000   3
hs4 76500000    88200000    77
hs4 88200000    124000000   2
hs5 58900000    180857866   8
hs5 58900000    76400000    2
hs5 58900000    97300000    4
hs5 76400000    143100000   14
hs5 97300000    147200000   6
hs6 7000000 29900000    2
hs6 63500000    70000000    73
hs6 63500000    92100000    4
hs6 70000000    113900000   70
hs6 70000000    139100000   57
hs6 92100000    113900000   3