有没有办法对行上的日期进行解析和排序?

有没有办法对行上的日期进行解析和排序?

如果您有一个文件,其中的行按以下顺序排序(从最旧到最新):

<2021-05-10 Mon> <2021-06-04 Fri> <2021-07-04 Sun> <2021-08-01 Sun> ...
<2021-05-10 Mon> <2021-06-04 Fri> <2021-07-22 Thu> <2021-08-11 Wed> ...
<2021-05-10 Mon> <2021-06-04 Fri> <2021-07-18 Sun> <2021-08-01 Sun> ... 
... 

是否有任何 shell 实用程序用于仅在一行中解析和排序日期顺序(从最新到最旧):

<2021-08-01 Sun> <2021-07-04 Sun> <2021-06-04 Fri> <2021-05-10 Mon> ...
<2021-08-11 Wed> <2021-07-22 Thu> <2021-06-04 Fri> <2021-05-10 Mon> ... 
<2021-08-01 Sun> <2021-07-18 Sun> <2021-06-04 Fri> <2021-05-10 Mon> ...
... 

通用方法也受到赞赏。

答案1

另一种perl方法:

$ perl -lpe '$_ = join " ", sort {$b cmp $a} /<.*?>/g' < file
<2021-08-01 Sun> <2021-07-04 Sun> <2021-06-04 Fri> <2021-05-10 Mon>
<2021-08-11 Wed> <2021-07-22 Thu> <2021-06-04 Fri> <2021-05-10 Mon>
<2021-08-01 Sun> <2021-07-18 Sun> <2021-06-04 Fri> <2021-05-10 Mon>

这会提取<...>包含的字符串,对它们进行反向排序(使用字节到字节的字符串比较,这对于那些 YYYY-MM-DD 日期应该可以正常工作),然后打印它们并用一个空格连接。这确实会丢弃输入中的任何其他内容(包括额外的空格或未包含在 中的文本<...>)。

在这里,由于输入是按时间顺序向前排列的,因此您也可以使用reverse按时间倒序排列来获取它:

perl -lpe '$_ = join " ", reverse /<.*?>/g'

答案2

人们可以(我相信)这样做:

perl -lpe '@F=split /</, $_ . " "; $_ = join "<", shift @F, sort {$b cmp $a} @F' sample.txt

缺点:它在行尾添加了额外的空格。一种修复方法是$_ =~ s/ $//在末尾添加:

@F = split /</, $_ . " "; 
$_ = join "<", shift @F, sort {$b cmp $a} @F; 
$_ =~ s/ $//

相关内容