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日
我认为您误解了该-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)
在第一个命令中,您将拆分组进行排序,如下所示:
31.12.202312.20232023由于您没有指定结束字符,因此您可以看到它使用完整值进行排序。
事实上,您可以添加--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)