我有一个文件,文件中包含模式“ 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”。
答案 0 :(得分:5)
我将在这里尝试做一些解释,然后将其应用于您的情况。
问题::我有一个
123a456b7c8d
形式的字符串,其中数字是任意长度的数字整数值,字母是相应的单位。我还具有将单位a,b,c,d
转换为单位f
的转换因子。如何将其转换为单一数量的单位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
}
转换并求和:这里我们假设我们有一个数组f
,其中包含转换因子:
function convert(a,f, t,k) {
t=0; for(k in a) t+=a[k] * f[k]
return t
}
完整代码(以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