我有一个包含日期的文本文件,以及两个以空格(很多这些)分隔的时间字符串,格式如下:
2011-03-05 15:16:41 15:16:42
我的问题是:
使用awk,我如何分离时间瞬间,将它们分配给变量然后减去它们?上述字符串的答案如下:
2011-03-05 0:0:1
文本文件由上述格式的许多行组成。
我经历过SO并且看到有很多日期和时间算术问题,但没有一个似乎符合这个特殊要求。
非常欢迎任何帮助,
斯利拉姆
答案 0 :(得分:3)
这是一个简单的awk脚本,它不使用任何时间函数:
$ cat subtract.awk
{
hh1=substr($2,1,2);
mm1=substr($2,4,2);
ss1=substr($2,7,2);
hh2=substr($3,1,2);
mm2=substr($3,4,2);
ss2=substr($3,7,2);
time1=hh1*60*60 + mm1*60 + ss1;
time2=hh2*60*60 + mm2*60 + ss2;
diff=time2-time1;
printf "%s %d:%d:%d\n",$1,diff/(60*60),diff%(60*60)/60,diff%60;
}
输入数据:
$ cat file.txt
2011-03-05 15:16:41 15:16:42
运行它:
$ awk -f subtract.awk < file.txt
2011-03-05 0:0:1
或者,您可以使用mktime
:
{
date=$1
gsub(/[-:]/," ");
diff=mktime ($1" "$2" "$3" "$7" "$8" "$9) - mktime ($1" "$2" "$3" "$4" "$5" "$6);
printf "%s %d:%d:%d\n",date,diff/(60*60),diff%(60*60)/60,diff%60;
}
答案 1 :(得分:1)
对于时间算术,我发现使用具有内置时间函数的语言更容易。例如,在Tcl
中set line "2011-03-05 15:16:41 15:16:42"
lassign [split $line] date time1 time2
set base [clock scan $date -format %Y-%m-%d]
set t1 [clock scan $time1 -format %T]
set t2 [clock scan $time2 -format %T]
set diff [expr {abs($t2 - $t1)}]
puts [clock format [clock add $base $diff seconds] -format "%Y-%m-%d %T"]
# ==> 2011-03-05 00:00:01