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



我的电流输出为

file | awk '$1=="IMAGE" {print $2","$7","$14","$17","$19/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

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

使用 Ed 的代码,我得到了这个输出,因为用户定义的命令给出了这样的输出,但是我希望它只给我天/周一/年。我可以在用户命令中使用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

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

command -ctime $14 | awk '{print $4"/"$5"/"$6"/"}

要获得您想要的格式(根据您的评论(,那么您所需要做的就是编写一个 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="," }
$1=="IMAGE" {print $2, $7, secs2time($14), secs2time($17), $19/1000}
'

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 " $3 | getline $3}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 "@$1"

最新更新