我有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