如何使用Shell脚本格式化数字

时间:2018-12-24 07:14:46

标签: shell awk sed

我有一个文本文件,内容如下:

[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命令)处理文档?

2 个答案:

答案 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()msus作为字段分隔符,它将$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被删除并且处理完成。