awk 在没有 strftime 或 date 命令的情况下转换 unix 时间(AIX 不支持 -d 和 -r 选项)

awk to convert unix time without strftime or date command(-d & -r option isn't supported in AIX)

我的当前输出为

file | awk '=="IMAGE" {print ","","","","/1000}'

ABC,POL1,1510009167,1510009677,20.5
DEF,POL2,1510009667,1510009887,20.5
XYZ,POL3,1510007867,1510009887,20.5
PQR,POL4,1510009267,1510009997,20.5

预期输出应该将这些 un​​ix 时间转换为人类可读的格式,我不能使用 strftime or date -d 选项,因为它们在 AIX 中不受支持。 我确实有一个用户定义的命令,我可以用它来转换但我不能在 awk.I 中使用它尝试创建函数然后在 awk 中使用它没有帮助

使用 Ed 的代码,我得到了这个输出,因为用户定义的命令给出了这样的输出,但是我希望它只给我 day/Mon/Year。我可以使用 awk 在用户命令中打印它,但是我应该在这个函数中使用它吗?

ABC POL1 1510009167 = Mon Nov  6 17:59:27 EST 2017 1510009677 = Tue Nov  7 04:37:57 IST 2017 20.5
DEF POL2 1510009667 = Mon Nov  6 18:07:47 EST 2017 1510009887 = Tue Nov  7 04:41:27 IST 2017 20.5
XYZ POL3 1510007867 = Mon Nov  6 17:37:47 EST 2017 1510009887 = Tue Nov  7 04:41:27 IST 2017 20.5
PQR POL4 1510009267 = Mon Nov  6 18:01:07 EST 2017 1510009997 = Tue Nov  7 04:43:17 IST 2017 20.5

GNU awk 有一个内置的 strftime() 函数,但您很可能在 AIX 上无法使用该函数。

尝试用 perl 代替 awk:

perl -MPOSIX=strftime -F, -ane '
    $F[2] = strftime("%Y-%m-%dT%H:%M:%S", localtime($F[2]));
    $F[3] = strftime("%Y-%m-%dT%H:%M:%S", localtime($F[3]));
    print join ",", @F
' <<END
ABC,POL1,1510009167,1510009677,20.5
DEF,POL2,1510009667,1510009887,20.5
XYZ,POL3,1510007867,1510009887,20.5
PQR,POL4,1510009267,1510009997,20.5
END
ABC,POL1,2017-11-06T17:59:27,2017-11-06T18:07:57,20.5
DEF,POL2,2017-11-06T18:07:47,2017-11-06T18:11:27,20.5
XYZ,POL3,2017-11-06T17:37:47,2017-11-06T18:11:27,20.5
PQR,POL4,2017-11-06T18:01:07,2017-11-06T18:13:17,20.5

如果您已有日期转换例程,请将其包装在命令中并从 awk

调用

使用您的数据

$ awk -F, '{"./todate.sh "  | getline }1' file

ABC POL1 Mon Nov  6 17:59:27 EST 2017 1510009677 20.5
DEF POL2 Mon Nov  6 18:07:47 EST 2017 1510009887 20.5
XYZ POL3 Mon Nov  6 17:37:47 EST 2017 1510009887 20.5
PQR POL4 Mon Nov  6 18:01:07 EST 2017 1510009997 20.5

我使用的日期转换是

==> todate.sh <==

#!/bin/bash    
date -d "@"

假设您提到的用户定义命令位于名为 "command" 的可执行文件中,该可执行文件位于您今天称为 PATH 的文件中:

command -ctime  | awk '{print "/""/""/"}

要获得您想要的格式(根据您的评论),您只需编写一个 awk 函数来调用它:

awk '
function secs2time(secs,     cmd, line, flds, time) {
    cmd = "command -ctime \"" secs "\""
    if ( (cmd | getline line) > 0  ) {
        split(line,flds," ")
        time = flds[4] "/" flds[5] "/" flds[6] "/"
    }
    else {
        time = "error:" secs
    }
    close(cmd)
    return time
}
BEGIN { FS=OFS="," }
=="IMAGE" {print , , secs2time(), secs2time(), /1000}
'