我正在关注此链接https://stackoverflow.com/a/54599800/10220825

file.txt

Iteration 1
RAM: +2s
Cache: +142ms (total +417ms)

Iteration 2
RAM: +184ms
Cache: +172ms
Searchms: +131ms (total +385ms)

Iteration 3
RAM: +149ms
Searchms: +3.2s

我想从时间值中删除ms or s,但不从名称中删除(例如,它不应删除Searchms到Search)。另外,如果时间值包含s into ms,我想通过multiply into 1000转换s并相应地打印结果。

预期输出:
RAM: 2000 184 149
Cache: 142 172
Searchms: 131 3200

try.awk
/:/{vals[$1]=vals[$1] OFS $2+0}
END {
         for (key in vals)
          print key vals[key]
}

执行时:awk -f try.awk file.txt
代码输出:
Cache: 142 172
Searchms: 131 3.2
RAM: 2 184 149

在我的输出s is not converting to ms.中,请建议我如何修改上述源代码try.awk以将s转换为ms。

新测试用例:
file.txt
Iteration 1
RAM: +2s342ms

Iteration 2
RAM: +2s

Iteration 3
RAM: +149ms

码:
/:/ && $2 ~/ms$/{vals[$1]=vals[$1] OFS $2+0;next}
/:/ && $2 ~/[^m]s$/{vals[$1]=vals[$1] OFS ($2+0)*1000}
END {
         for (key in vals)
          print key vals[key]
}

预期产量:
RAM: 2342 2000 149

输出:
RAM: 2 2000 149

最佳答案

您可以使用以下awk脚本:

/:/ && $2 ~/ms$/{vals[$1]=vals[$1] OFS $2+0;next}
/:/ && $2 ~/[^m]s$/{vals[$1]=vals[$1] OFS ($2+0)*1000}
END {
         for (key in vals)
          print key vals[key]
}

这将产生输出:
awk -f try.awk file.txt
Cache: 142 172
Searchms: 131 3200
RAM: 2000 184 149

说明:
  • 条件$2 ~/ms$/将检查是否有一行ms,在这种情况下,逻辑与以前相同,并且next将迫使awk跳至下一行。
  • /:/ && $2 ~/[^m]s$/{vals[$1]=vals[$1] OFS ($2+0)*1000}当我们达到此范围时,我们知道我们在s中有一行单位,并将其乘以1000即可将其转换为ms

  • 为了满足您的新要求,我将try.awk修改为:
    /:/ && $2 ~/[0-9]+s[0-9]+ms$/{split($2,buff,/s/);vals[$1]=vals[$1] OFS (buff[1]+0)*1000+buff[2];next}
    /:/ && $2 ~/ms$/{vals[$1]=vals[$1] OFS $2+0;next}
    /:/ && $2 ~/[^m]s$/{vals[$1]=vals[$1] OFS ($2+0)*1000}
    END {
             for (key in vals)
              print key vals[key]
    }
    

    输入:
    $ cat file2.txt
    Iteration 1
    RAM: +2s342ms
    
    Iteration 2
    RAM: +2s
    
    Iteration 3
    RAM: +149ms
    

    输出:
    $ awk -f try.awk file2.txt
    RAM: 2342 2000 149
    

    关于shell - 以awk的特定顺序打印文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54702875/

    10-16 20:37