我有一个制表符分隔的文件,日期列包含两种不同格式的日期。我正在使用此排序命令按一种格式类型排序(“%a %b %d %H:%M:%S %Z %Y”),但是有什么方法可以按日期列排序,无论它是格式?谢谢!
输入
date
Mon Mar 02 03:56:26 UTC 2020
2020-03-03 15:46:52
sort -t$'\t' -k 3.25,3.28n -k 3.5,3.7M -k 3.9,3.10n -k 3.12,3.13n -k 3.15,3.16n -k3.18,3.19n sample.csv
答案1
您可以将这两种格式转换为明确的时间(例如纪元时间),对其进行排序,然后丢弃。例如,使用磨坊主
mlr --tsv put '
$epoch = ($date =~ "^[A-Z][a-z][a-z]") ? strptime($date,"%a %b %d %H:%M:%S %Z %Y") : strptime($date,"%Y-%m-%d %H:%M:%S")
' then sort -n epoch then cut -f date input
答案2
尝试使用和命令将您的"%a %b %d %H:%M:%S %Z %Y"
格式(或 可以识别的任何其他格式)转换date -d
为%F %T
( %Y-%m-%d %H:%M:%S
) 。awk
date
要转换的字段号在 awk 变量中给出,col
如果该字段已经采用正确的格式,则跳过该字段。好吧,您可以删除该检查,但显然这会使脚本变慢。
awk -v col=3 '
BEGIN{ FS=OFS="\t" }
# or remove the check and begin the next line with an opening `{`
$(col) !~ /^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}$/{
cmd="date -u -d \"" $(col) "\" +\"%F %T\""
cmd | getline $(col)
close(cmd)
$0=$0
}
1
' infile > outfile
然后对所需字段使用字典排序,例如sort -t$'\t' -k3,3 file
。