如何使用“sort”命令按年月日升序排序?

如何使用“sort”命令按年月日升序排序?

我想按以下格式对日期进行排序31.12.2023。应首先显示最低年份,然后显示最低月份,最后显示最低日期。

以下代码符合我的需求吗?乍一看似乎不错。

sort -t '.' -k 3.1 -k 2.1 -k 1.1

但对我来说更有意义的是:

sort -t '.' -k 3.4 -k 2.1 -k 1.1

但这并不是我想要的结果。

编辑:

谢谢您的回复!

@Dan 感谢您的详细解释。仍然不知道如何确切地解决 key 选项的问题。我测试了您的代码,但仍然混淆了一些东西。也许是我在变量中使用它的方式,或者是字符串中的内容类型。

然后尝试了 @FedKad 的提示,这似乎像我的 -k 3.1 -k 2.1 -k 1.1 一样有效。它和 -k 3 -k 2 -k 1 的意思一样吗?

目前我只有 2023 年的条目,因此无法评估年份是否也有效,但目前使用上述键,我已按我想要的方式排序。也许我描述我需要的结果的方式失败了,但现在我得到了从最低到最高的日期和从最低到最高的月份。对于年份,我必须等到 2024 年 :) 这是我的输出示例

2023 年 7 月 1 日

2023 年 1 月 8 日

2023 年 9 月 1 日

2023 年 1 月 21 日

2023 年 1 月 26 日

2023 年 1 月 27 日

2023 年 2 月 2 日

答案1

我认为你误解了这个-k选项。该参数值的格式-k如下:group.start_index,group.end_index

组的第一个字符的索引为 1。 的默认值为start_index1的默认值end_index是行的末尾,而不是组的末尾。

sort -t '.' -k 3.1 -k 2.1 -k 1.1

在第一个命令中,您将拆分组以进行排序,如下所示:

  • 第一组将是31.12.2023
  • 第 2 组将是12.2023
  • 第三组将是2023

由于您没有指定结束字符,您可以看到它使用完整值进行排序。

事实上,您可以添加--debug到您的命令中,它会向您显示更多信息。

$ sort -t '.' -k 3.1 -k 2.1 -k 1.1 --debug dates.txt
31.12.2023
      ____
   _______
__________
__________

在您的第二条命令中,这是一个类似的问题。但是,年份组仅使用年份的最后一位数字。在您的示例中,它仅使用3

$ sort -t '.' -k 3.4 -k 2.1 -k 1.1 --debug dates.txt
31.12.2023
         _
   _______
__________
__________

解决方案:

您需要的是以下命令:

sort -t '.' -k 3.1,3.4 -k 2.1,2.2 -k 1.1,1.2

这就是它的样子--debug

$ sort -t '.' -k 3.1,3.4 -k 2.1,2.2 -k 1.1,1.2 --debug dates.txt
31.12.2023
      ____
   __
__
__________

事实上,正如@jcaron提到的评论下面,在这种情况下,您的初始命令的结果和我提到的解决方案的结果将相同。值的最后一部分已经排序,如果您不省略它,则不会影响排序。

sort -t '.' -k 3.1 -k 2.1 -k 1.1

甚至更好,正如@FedKad 所建议的评论,您甚至可以省略起始索引,因为它1无论如何都是默认的。

sort -t '.' -k 3 -k 2 -k 1

相关内容