Bash 如何计算awk中args的时差

Bash 如何计算awk中args的时差,bash,shell,awk,Bash,Shell,Awk,我有以下格式的输入 0001580-160219044548744-oozie-oozi-W@:start: - - - - OK :start: 0 - :START: 2016-02-24 13:34:46 GMT OK 2016-02-24 13:34:46 GMT 0001580-160219044548744-oozie-oozi-W@PrepareHDFS -

我有以下格式的输入

0001580-160219044548744-oozie-oozi-W@:start:    -       -       -       -       OK      :start: 0       -       :START: 2016-02-24 13:34:46 GMT OK      2016-02-24 13:34:46 GMT
0001580-160219044548744-oozie-oozi-W@PrepareHDFS        -       -       -       -       OK      PrepareHDFS     0       -       fs      2016-02-24 13:34:46 GMT OK  2016-02-24 13:34:47 GMT
使用awk,我正在尝试使用下面的命令打印7、12、16列中所需的列,如下所示

cat input |  awk '/^000/ {printf "%-40s %-10s %-10s",$7,$12,$16}'
输出是

:start:                                  05:35:56   05:35:56
PrepareHDFS                              05:35:56   05:35:57
我的要求是随着上述输出我需要的时间差也。 我试着在一个脚本中找到下面的一个

cat intput | awk '/^000/ {printf "%-40s %-10s %-10s",$7,$12,$16; 
T1=`date +%s -d $12`;T2=`date +%s -d $16`;
DIFF=`expr ${SEC2} - ${SEC1}`; print `date +%H:%M:%S -ud ${DIFF}` }'
但我得到的错误是无效语法。如何实现时差,以便输出

PrepareHDFS                              05:35:56   05:35:57  00:00:01
ScheduleStart                            05:35:57   05:36:11  00:00:14
编辑:

对于时差,我有下面的脚本

TIME1=05:36:27
TIME2=05:36:51
SEC1=`date +%s -d ${TIME1}`
SEC2=`date +%s -d ${TIME2}`
DIFFSEC=`expr ${SEC2} - ${SEC1}`
echo `date +%H:%M:%S -ud @${DIFFSEC}`
00:00:24

我可以在一个函数中使用这组行,并从awk调用该函数吗?

你可以使用
awk
,它只是有点……不舒服:

awk -v cmd='date +%s -d ' -v cmd2='date +%H:%M:%S -d ' '/^000/ {
  cmd $12 | getline T1; close(cmd $12); 
  cmd $16 | getline T2; close(cmd $16); 
  cmd2 (T2 - T1) | getline T1; close(cmd2 (T2 - T1)); 
  printf "%-40s %-10s %-10s%-10s\n", $7, $12, $16, T1
}'
您不能在
awk
中使用shell的backtick进程替换
awk
有自己的方式获取命令的输出-通过。语法大致如下:

command | getline var-name
close(command)
其中
command
是包含该命令的变量或字符串
cmd$12
只是
cmd
$12
的串联,因此该命令将变成
date+%s-d13:34:46

date
纯数字作为输入的解释很复杂。最好使用前导的
@
,强制它将输入的数字视为Unix时间戳:

awk -v cmd='date +%s -d ' -v cmd2='date +%H:%M:%S -d @' '/^000/ {
  cmd $12 | getline T1; close(cmd $12); 
  cmd $16 | getline T2; close(cmd $16); 
  cmd2 (T2 - T1) | getline T3; close(cmd2 (T2 - T1)); 
  printf "%-40s %-10s %-10s%-10s\n", $7, $12, $16, T3
}'

谢谢muru,部分工作正常。时差计算不正确,少数线路出现错误ScheduleStart 06:18:53 06:19:08 15:00:00 Nas2Hdfs-4590 06:19:08 06:19:23 1456399148日期:无效日期“25”@Abhinay请参阅更新。更改
cmd2
,使其以
@
-结尾,而我忘记了使用
-u
选项。