在awk中将秒模式转换为毫秒

时间:2019-05-16 08:44:05

标签: bash perl awk

我有一个文件,文件中包含模式“ s”,我需要乘以1000转换为“ ms”。我无法执行此操作。请帮助我。

file.txt

First launch 1
App: +1s170ms

First launch 2
App: +186ms

First launch 3
App: +1s171ms

First launch 4
App: +1s484ms

First launch 5
App: +1s227ms

First launch 6
App: +204ms

First launch 7
App: +1s180ms

First launch 8
App: +1s177ms

First launch 9
App: +1s183ms

First launch 10
App: +1s155ms

我的代码:

awk 'BEGIN { FS="[: ]+"}
/:/ && $2 ~/ms$/{vals[$1]=vals[$1] OFS $2+0;next}
END {
         for (key in vals)
          print key vals[key]
}' file.txt

预期输出:

App 1170 186 1171 1484 1227 204 1180 1177 1183 1155

即将输出:

App 1 186 1 1 1 204 1 1 1 1

如果出现第二种模式,如何将上述模式s转换为“ ms”。

2 个答案:

答案 0 :(得分:5)

我将在这里尝试做一些解释,然后将其应用于您的情况。

  

问题::我有一个123a456b7c8d形式的字符串,其中数字是任意长度的数字整数值,字母是相应的单位。我还具有将单位a,b,c,d转换为单位f的转换因子。如何将其转换为单一数量的单位f

     

示例:从1s183ms1183ms

策略:

  1. 为每个字符串创建一组键值对'a' => 123'b' => 456'c' => 7'd' => 8
  2. 将每个值乘以corect转换因子
  3. 将数字加在一起

假设我们使用awk,并且键值对存储在数组a中,并且键作为索引。

  1. str中提取键值对:

    function extract(str,a,   t,k,v) {
       delete a; t=str; 
       while(t!="") { 
          v=t+0; match(t,/[a-zA-Z]+/); k=substr(t,RSTART,RLENGTH);
          t=substr(t,RSTART+RLENGTH);
          a[k]=v
       }
       return
     }
    
  2. 转换并求和:​​这里我们假设我们有一个数组f,其中包含转换因子:

    function convert(a,f,  t,k) {
       t=0; for(k in a) t+=a[k] * f[k]
       return t
    }
    
  3. 完整代码(以OP为例)

    # set conversion factors
    BEGIN{ f['s']=1000; f['ms'] = 1 }
    # print first word
    BEGIN{ printf "App:" }
    # extract string and print
    /^App/ { extract($2,a); printf OFS "%dms", convert(a,f) }
    END { printf ORS }
    

输出:

 App: 1170ms 186ms 1171ms 1484ms 1227ms 204ms 1180ms 1177ms 1183ms 1155ms

答案 1 :(得分:1)

perl -n -e '$s=0; ($s)=/(\d+)s/; ($ms)=/(\d+)ms/;
            s/^(\w+):/push @{$vals{$1}}, $ms+$s*1000/e;
            eof && print "$_: @{$vals{$_}}\n" for keys %vals;' file`
  • perl -n在输入中循环时不显示任何内容。
  • $s$ms设置为这些字段。确保$s重置为零
  • s///e%vals哈希中填充了每个键App的数字列表,以毫秒为单位。
  • eof &&在文件结尾之后执行后续代码。
  • print "$_: @{$vals{$_}}\n" for keys %vals正在按照OP的要求打印%vals哈希。
  

App:1170 186 1171 1484 1227 204 1180 1177 1183 1155