转换"天hh:mm:ss"字段为hh:mm:ss或秒使用sed或awk

时间:2017-05-12 00:35:03

标签: awk sed

我想采用以下制表符分隔的输入,并将字段4和5中持续时间的天数修改为Excel友好的持续时间,HH:MM:SS或理想的秒数。这些字段可测量可能跨越00:00:00到数百天的正常运行时间 输入:

<ip-address>  field(2 / 2)  field:(3:3)   2 days 18:18:27  23:23:57          n kB   n GB
<ip-address>  field(2 / 2)  field:(3:3)   18:18:27         23:23:57          n kB   n GB
<ip-address>  field(2 / 2)  field:(3:3)   18:18:27         2 days 23:23:57   n kB   n GB
<ip-address>  field(2 / 2)  field:(3:3)   2 days 18:18:27  21 days 23:23:57  n kB   n GB

第一条记录的所需输出,可以是:

<ip-address>  field(2 / 2)  field:(3:3)   66:18:27         23:23:57          n kB   n GB
<ip-address>  field(2 / 2)  field:(3:3)   2387027          84237             n kB   n GB

当文件以制表符分隔时,有七个字段;如果使用制表符,空格分隔,则:它更像是30.字段2和3更长,但复杂程度与显示的相同。

使用sed我可以创建一个表达式,但不知道如何评估它:

sed "s/\([0-9]\+\) days \([0-9]\+\)/\1*24+\2/g" file
<ip-address>    field(2 / 2)    field:(3:3)    2*24+18:18:27      23:23:57    n kB   n GB

我知道sed有一个evaluate方法,但它将整个模式空间传递回shell

sed "s/\([0-9]\+\) days \([0-9]\+\)/\1*24+\2/e" file
<ip-address> is not recognised as an internal or external command yada yada

我知道如何在awk表达式hrs = $2 * 24 + $3中使用字段,但在这种情况下,需要首先拆分字段。将这条线分成30个区域似乎不值得。

有没有办法在awk中拆分字段然后评估组件上的表达式,或者在sed中评估上面的表达式,或者以其他方式?

在Win7上使用Gnu sed和awk。目前没有bc,除非它引人注目,否则宁愿避免。

编辑:两个字段中的澄清日期都是可选的。

1 个答案:

答案 0 :(得分:2)

awk救援!

awk 'BEGIN {FS=OFS="\t"} 
           {split($4,d," days "); 
            split(d[2],t,":"); 
            h=d[1]*24+t[1]; 
            $4=h":"t[2]":"t[3]; 
            print; 
            $4=(h*60+t[2])*60+t[3]}1' file

<ip-address>    field(2 / 2)    field:(3:3) 66:18:27    23:23:57    n kB    n GB
<ip-address>    field(2 / 2)    field:(3:3) 238707  23:23:57    n kB    n GB