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

时间:2017-11-14 16:31:51

标签: awk unix-timestamp aix text-processing

我的当前输出为

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

如果您已有日期转换例程,请将其包装在命令中并从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"

答案 2 :(得分:1)

假设您提到的用户定义的命令位于名为&#34; command&#34;的可执行文件中。在你的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}
'