我的文件带有模式“ 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'。
在这里,我将尝试做一些一般性的解释,然后将其应用于您的案例。
问题:我有一个字符串形式
123a456b7c8d
,其中数字是任意长度的数字整数值,字母是相应的单位。我也有转换因子,可以从unit转换a,b,c,d
为unitf
。如何将其转换为单一数量的单位f
?示例: 从
1s183ms
到1183ms
战略:
'a' => 123
,'b' => 456
,'c' => 7
和'd' => 8
假设我们使用awk,并且键值对存储在数组中a
,并且键作为索引。
从中提取键值对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)转换和求和:这里我们假设我们有一个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)完整代码(以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)