如何排序DD-MM-YYYY日期linux



我有DD/MM/YYYY格式的日期,但需要注意的是,对于天<10个日期为个位数。

以下是一些示例数据:

name,date,time
DEF,1/02/2021,06:00
HIJ,31/01/2021,07:50
ABC,1/04/2021,05:50

我只想按日期列排序。我觉得这很有挑战性,因为日期值的天数部分的长度是可变的。

没有一种简单的方法可以直接在逗号分隔的字段中对日期字段([d]d/mm/yyyy(进行排序(sort本机理解美国mm/dd/yyyy风格的日期,但不理解这种国际替代方法(。然而,挑选出日期字段并将字段重新排序为yyyy-mm-dd会更容易,而sort可以将其作为标准的字母数字排序来处理。临时提取主排序键的过程被称为施瓦茨变换。

在这里,您可以对结果进行排序,然后丢弃第一个(临时(字段,以重新获得原始的未更改数据。

awk -F'[,/]' '{printf "%04d-%02d-%02dt%sn", $4,$3,$2, $0}' datafile | sort | cut -f2-
name,date,time
HIJ,31/01/2021,07:50
ABC,1/02/2021,05:50
DEF,1/02/2021,06:00

如果在sort命令之前或之后剥离,则可以看到中间过程的结果。

使用GNU awk,您可以使用它的内部排序函数:

awk 'BEGIN{PROCINFO["sorted_in"]="@ind_num_asc"; FS=","}
{split($2,b,"/"); a[b[3]*10000 + b[2]*100 + b[1]]=$0}
END{for(i in a) print a[i]}' file

更多详情点击此处

按照分隔符拆分数据"quot;以及"/"(使用awk(,您将得到五列:

DEF  1 02 2021 06:00
HIJ 31 01 2021 07:50
ABC  1 04 2021 05:50

然后,根据第四列、第三列和第二列进行数字排序(sort -k4,3,2 -n或类似的内容(。

您可能会决定将数据保留为已转换的数据(您将得到此结果(:

HIJ 31 01 2021 07:50
DEF  1 02 2021 06:00
ABC  1 04 2021 05:50

或者你可能想把它放回原始格式:

HIJ, 31/01/2021 07:50
DEF,  1/02/2021 06:00
ABC,  1/04/2021 05:50

相关内容

  • 没有找到相关文章

最新更新