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
预期输出应该将这些 unix 时间转换为人类可读的格式,我不能使用 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}
'
我的当前输出为
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
预期输出应该将这些 unix 时间转换为人类可读的格式,我不能使用 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}
'