如果您有一个文件,其中的行按以下顺序排序(从最旧到最新):
<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/ $//