对具有两种不同日期时间格式的列进行排序

对具有两种不同日期时间格式的列进行排序

我有一个制表符分隔的文件,日期列包含两种不同格式的日期。我正在使用此排序命令按一种格式类型排序(“%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) 。awkdate

要转换的字段号在 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

相关内容