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

Rat*_*esh 0 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
Run Code Online (Sandbox Code Playgroud)

我的代码:

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

预期产量:

App 1170 186 1171 1484 1227 204 1180 1177 1183 1155
Run Code Online (Sandbox Code Playgroud)

输出结果:

App 1 186 1 1 1 204 1 1 1 1
Run Code Online (Sandbox Code Playgroud)

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

kva*_*our 5

在这里,我将尝试做一些一般性的解释,然后将其应用于您的案例。

问题:我有一个字符串形式123a456b7c8d,其中数字是任意长度的数字整数值,字母是相应的单位。我也有转换因子,可以从unit转换a,b,c,d为unit 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
     }
    
    Run Code Online (Sandbox Code Playgroud)
  2. 转换和求和:这里我们假设我们有一个f包含转换因子的数组:

    function convert(a,f,  t,k) {
       t=0; for(k in a) t+=a[k] * f[k]
       return t
    }
    
    Run Code Online (Sandbox Code Playgroud)
  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 }
    
    Run Code Online (Sandbox Code Playgroud)

输出:

 App: 1170ms 186ms 1171ms 1484ms 1227ms 204ms 1180ms 1177ms 1183ms 1155ms
Run Code Online (Sandbox Code Playgroud)