【问题标题】:How to sum up the numbers in strings and produce a single summary string如何汇总字符串中的数字并生成单个汇总字符串
【发布时间】:2017-03-22 23:40:10
【问题描述】:

我有一个运行测试结果的文件。在该文件中,有很多行包含每个测试的结果:

$ grep "tests," results/RunAll_unit_staging-dc1.txt 
1 tests, 2 assertions, 0 failures, 0 errors, 0 skips
1 tests, 7 assertions, 0 failures, 0 errors, 0 skips
1 tests, 2 assertions, 1 failures, 0 errors, 0 skips
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
1 tests, 4 assertions, 0 failures, 0 errors, 0 skips
1 tests, 6 assertions, 0 failures, 0 errors, 0 skips
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
1 tests, 16 assertions, 0 failures, 0 errors, 0 skips
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
8 tests, 152 assertions, 0 failures, 0 errors, 0 skips
1 tests, 3 assertions, 0 failures, 0 errors, 0 skips
$

我想知道是否有一种方法可以将这些行合并为一个汇总行,并对总数进行汇总。在上述情况下,它看起来像:

22 tests, 213 assertions, 1 failures, 0 errors, 0 skips

我可以 awk 他们生成列中的数字,如下所示:

$ grep "tests," results/RunAll_unit_staging-dc1.txt | awk '{print $1, $3, $5, $7, $9}'
1 2 0 0 0
1 7 0 0 0
1 2 1 0 0
1 3 0 0 0
1 3 0 0 0
1 3 0 0 0
1 4 0 0 0
1 6 0 0 0
1 3 0 0 0
1 16 0 0 0
1 3 0 0 0
1 3 0 0 0
1 3 0 0 0
8 152 0 0 0
1 3 0 0 0
$

但我不确定从这里去哪里总结列并将它们放回字符串中。也许我看错了方向。任何帮助表示赞赏

谢谢

一个

【问题讨论】:

    标签: bash shell parsing awk sed


    【解决方案1】:

    你可以试试这个;

    awk '/tests/ {sum1+=$1; sum2+=$3;sum3+=$5; sum4+=$7;sum5+=$9;} END {printf "%d tests, %d assertions, %d failures, %d errors,%d skips\n" , sum1 ,sum2,sum3,sum4,sum5}' results/RunAll_unit_staging-dc1.txt
    

    例如;

    $ awk '/tests,/ {sum1+=$1; sum2+=$3;sum3+=$5; sum4+=$7;sum5+=$9;} END {printf "%d tests, %d assertions, %d failures, %d errors, %d skips\n" , sum1 ,sum2,sum3,sum4,sum5}' testFile
    22 tests, 213 assertions, 1 failures, 0 errors, 0 skips
    

    【讨论】:

    • 无需在管道中同时使用 grep 和 awk。
    • 谢谢。正是我想要的。我最初有 grep 和 awk,因为我不确定该采取什么方向。管道将每个都放入一个输出步骤中,我正在处理该步骤以产生我想要的答案
    【解决方案2】:

    可以用perl

    perl -lne 'while(/(\d+) (\w+)/g){$x{$2}+=$1}}{print join(", ",map{"$_ $x{$_}"}keys %x)' f
    
    failures 1, skips 0, errors 0, tests 22, assertions 213
    

    【讨论】:

      猜你喜欢
      • 2017-03-30
      • 2022-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 2019-11-25
      相关资源
      最近更新 更多