我有一个文本文件,内容如下:
[ForwardTimer],__fc_layer_1__,[Span:1ms970us]
[ForwardTimer],__batch_norm_2__,[Span:5ms64us]
[ForwardTimer],__batch_norm_3__,[Span:5ms87us]
我想以毫秒为单位转换时间值,例如
[ForwardTimer],__fc_layer_1__,1.970ms
[ForwardTimer],__batch_norm_2__,5.064ms
[ForwardTimer],__batch_norm_3__,5.087ms
,同时保持先前的单词不变。 如何使用Shell脚本(尤其是sed或awk命令)处理文档?
答案 0 :(得分:0)
awk -F '\\[Span:' '{split($2,array,"ms|us"); printf("%s%s.%03dms\n",$1,array[1],array[2])}' file.txt
输出:
[ForwardTimer],__fc_layer_1__,1.970ms [ForwardTimer],__batch_norm_2__,5.064ms [ForwardTimer],__batch_norm_3__,5.087ms
这将用行[Span:
作为行分隔符的行分为两部分($1
和$2
)。使用功能split()
和ms
或us
作为字段分隔符,它将$2
分为三部分(array[1]
,array[2]
和array[3]
)。 array[3]
未使用。格式化后的输出为printf()
。
答案 1 :(得分:0)
这可能对您有用(GNU sed):
@if(isset($admission->dossiersocials))
@foreach($admission->dossiersocials as $dossiersocial)
<tr>
<td>{{$dossiersocial->id}}</td>
<td>{{$dossiersocial->user_id}}</td>
<td>{{$dossiersocial->patient_id}}</td>
<td>{{$dossiersocial->admission_id}}</td>
<td>{{$dossiersocial->nationalite}}</td>
</tr>
@endforeach
@endif
使用模式匹配和反向引用来获得所需的结果。
不要忘记使用循环和引入的换行符将比赛的小数部分零位,并在完成时将其删除。
第一个替换命令着重于诸如sed -E 's/\[Span:([0-9]*)([^0-9]*)([0-9]*)[^]]*[]]/\1.\n\3\2/;:a;/\n[0-9]{3}/!s/\n/&0/;ta;s/\n//' file
之类的字符串,如果找到,则将后向引用1中的[Span:5ms64us]
分组为后向引用2中的5
,并将后向ms
分组参考3.将它们重新排列为64
,即\1.\n\3\2
,并删除了初始字符串的其余部分。
sed脚本的第二部分用零隔开后向引用3的小数部分,以3位数字长且带有前导零。使用5.\n64ms
作为标记,如果\n
之后的数字长度小于3,则将\n
附加到0
并重复检查。支票通过后,即有3位数字,\n
被删除并且处理完成。