我的当前输出为
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
答案 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}
'