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

dig*_*dre 6 command-line sort text-processing

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

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

sort -t '.' -k 3.1 -k 2.1 -k 1.1
Run Code Online (Sandbox Code Playgroud)

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

sort -t '.' -k 3.4 -k 2.1 -k 1.1
Run Code Online (Sandbox Code Playgroud)

但这并没有按照我想要的方式排序。

编辑:

谢谢您的回复!

@Dan 谢谢你非常详细的解释。仍然不知道如何准确地处理关键选项。我测试了你的代码,但它仍然混合了一些东西。也许这是我在变量中使用它的方式,或者可能是字符串中内容的类型。

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

目前我只有 2023 年的条目,所以无法评估年份是否也有效,但现在使用上面的键,我已经按照我想要的方式进行了排序。也许我描述我需要的结果是失败的,但现在我得到了日最低到最高和月最低到最高。今年我将不得不等到 2024 年到来:)这是我的输出示例

2023年1月7日

2023年1月8日

2023年1月9日

2023年1月21日

2023年1月26日

2023年1月27日

2023年2月2日

Dan*_*Dan 9

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

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

sort -t '.' -k 3.1 -k 2.1 -k 1.1
Run Code Online (Sandbox Code Playgroud)

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

  • 第 1 组将是31.12.2023
  • 第 2 组将是12.2023
  • 第3组将是2023

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

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

$ sort -t '.' -k 3.1 -k 2.1 -k 1.1 --debug dates.txt
31.12.2023
      ____
   _______
__________
__________
Run Code Online (Sandbox Code Playgroud)

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

$ sort -t '.' -k 3.4 -k 2.1 -k 1.1 --debug dates.txt
31.12.2023
         _
   _______
__________
__________
Run Code Online (Sandbox Code Playgroud)

解决方案:

你想要的是以下命令:

sort -t '.' -k 3.1,3.4 -k 2.1,2.2 -k 1.1,1.2
Run Code Online (Sandbox Code Playgroud)

这是它的样子--debug

$ sort -t '.' -k 3.1,3.4 -k 2.1,2.2 -k 1.1,1.2 --debug dates.txt
31.12.2023
      ____
   __
__
__________
Run Code Online (Sandbox Code Playgroud)

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

sort -t '.' -k 3.1 -k 2.1 -k 1.1
Run Code Online (Sandbox Code Playgroud)

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

sort -t '.' -k 3 -k 2 -k 1
Run Code Online (Sandbox Code Playgroud)