【问题标题】:Using sort -k (with 2 fields) as long as -g使用 sort -k(有 2 个字段)只要 -g
【发布时间】:2016-07-05 22:06:46
【问题描述】:

这就是我正在做的事情

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

【问题讨论】:

  • 前两个字符是否总是hs?如果不是,ab2 是排在xy1 之前还是之后? :)

标签: sorting unix command-line


【解决方案1】:

-k 1,2 并不意味着使用字段 1 和 2 这两个键进行排序。它意味着使用由字段 1 和 2 的内容组成的单个键进行排序。使用数字排序时,这根本不起作用。事实上,您可以使用--debug 看到 sort 所做的是决定像 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 并且没有多位数字,但正确的选择取决于您打算在其他情况下发生的情况。

【讨论】:

  • 这是一个很好的解释!
【解决方案2】:

那个 -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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 2012-07-08
    • 2014-04-30
    • 1970-01-01
    • 2017-04-22
    相关资源
    最近更新 更多