在AWK中转换日期

PSt*_*ons 17 awk command-line datetime

我有一个包含许多文本列的文件,包括一行的时间戳Fri Jan 02 18:23,我需要将该日期转换为MM/DD/YYYY HH:MM格式.

我一直在尝试使用带有awk getline的标准"date"工具来进行转换,但我无法弄清楚如何以预期的格式将字段传递给'date'命令(引用"或") s,)因为getline也需要用引号括起来的命令字符串.

就像是 "date -d '$1 $2 $3 $4' +'%D %H:%M'" | getline var

现在我考虑一下,我想我真正想问的是如何将awk变量嵌入到字符串中.

Pau*_*ce. 21

如果您使用GAWK,你不需要外部date可以是昂贵的重复调用:

awk '
BEGIN{
   m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",d,"|")
   for(o=1;o<=m;o++){
      months[d[o]]=sprintf("%02d",o)
    }
format = "%m/%d/%Y %H:%M"
}
{
split($4,time,":")
date = (strftime("%Y") " " months[$2] " " $3 " " time[1] " " time[2] " 0")
print strftime(format, mktime(date))
}'
Run Code Online (Sandbox Code Playgroud)

感谢ghostdog74这个答案的几个月数组.

  • +1 让 awk 完成所有工作。`strftime()` 需要 gawk (2认同)

gho*_*g74 17

你可以试试这个.假设您指定的日期在文件中

awk '
{
    cmd ="date \"+%m/%d/%Y %H:%M\" -d \""$1" "$2" "$3" "$4"\""
    cmd | getline var
    print var
    close(cmd)
}' file
Run Code Online (Sandbox Code Playgroud)

产量

$ ./shell.sh
01/02/2010 18:23
Run Code Online (Sandbox Code Playgroud)

如果您不使用GNU工具,例如您在Solaris中,请使用nawk

nawk 'BEGIN{
   m=split("Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec",d,"|")
   for(o=1;o<=m;o++){
      months[d[o]]=sprintf("%02d",o)
   }
   cmd="date +%Y"
   cmd|getline yr
   close(cmd)
}
{
    day=$3
    mth=months[$2]
    print mth"/"day"/"yr" "$4
} ' file
Run Code Online (Sandbox Code Playgroud)