我想按以下格式对日期进行排序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_index
。1
的默认值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