我想采用以下制表符分隔的输入,并将字段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,除非它引人注目,否则宁愿避免。
编辑:两个字段中的澄清日期都是可选的。
答案 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