Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk计算时差_Bash_Shell_Awk - Fatal编程技术网

Bash 使用awk计算时差

Bash 使用awk计算时差,bash,shell,awk,Bash,Shell,Awk,我有以下input.txt文件。我需要计算$2和$3的时间差,并以小时为单位打印时间差 P1, 2016-05-30 00:11:20, 2016-05-30 04:36:40 P2, 2016-05-30 00:07:20, 2016-05-30 04:32:31 我有以下代码,但看起来小时数显示不准确。请帮忙 awk -F, '{gsub(/[-:]/," ",$2);gsub(/[-:]/," ",$3); d2=mktime($3

我有以下input.txt文件。我需要计算$2和$3的时间差,并以小时为单位打印时间差

P1,       2016-05-30 00:11:20,    2016-05-30 04:36:40
P2,       2016-05-30 00:07:20,    2016-05-30 04:32:31
我有以下代码,但看起来小时数显示不准确。请帮忙

awk -F, '{gsub(/[-:]/," ",$2);gsub(/[-:]/," ",$3);
          d2=mktime($3);d1=mktime($2);
          print $1","(d2-d1)/3600,"hrs";}' input.txt
我得到的输出是这样的

P1,4.42222 hrs
P2,4.41972 hrs
但它应该显示出一种不同 4:25:20小时 4:25:11小时


提前感谢

如果您想以HH:MM:SS语法打印秒数,您需要自己进行计算。如果您想打印,使用
printf
将非常有用,例如,4:02:30而不是4:2:30。比如说,

secs = d2 - d1;
printf "%s, %d:%02d:%02d hrs.\n", $1, int(secs/3600), int(secs/60)%60, secs%60

你想用hh:mm:ss格式打印差异?是的,出于好奇,我想用hh:mm:ss格式打印输出,你怎么会想到awk会猜到?mktime的结果只是一个数字。是否有其他解决方案可供使用?
$ cat tst.awk
BEGIN { FS=",[[:space:]]+"; OFS="," }
function dt2secs(dt) { return mktime(gensub(/[-:]/," ","g",dt)) }
function secs2hms(s) { return sprintf("%d:%02d:%02d hrs",s/(60*60),(s/60)%60,s%60) }
{ print $1, secs2hms(dt2secs($3)-dt2secs($2)) }

$ awk -f tst.awk file
P1,4:25:20 hrs
P2,4:25:11 hrs