自动汇总数字列和打印总数

Ben*_*son 8 language-agnostic awk code-golf

鉴于以下产出git ... --stat:

 3 files changed, 72 insertions(+), 21 deletions(-)
 3 files changed, 27 insertions(+), 4 deletions(-)
 4 files changed, 164 insertions(+), 0 deletions(-)
 9 files changed, 395 insertions(+), 0 deletions(-)
 1 files changed, 3 insertions(+), 2 deletions(-)
 1 files changed, 1 insertions(+), 1 deletions(-)
 2 files changed, 57 insertions(+), 0 deletions(-)
 10 files changed, 189 insertions(+), 230 deletions(-)
 3 files changed, 111 insertions(+), 0 deletions(-)
 8 files changed, 61 insertions(+), 80 deletions(-)
Run Code Online (Sandbox Code Playgroud)

我想生成数字列的总和,但保留行的格式. 为了通用性,我制作了这个awk脚本,它自动对任何数字列求和并生成一个摘要行:

{
    for (i = 1; i <= NF; ++i) {
        if ($i + 0 != 0) {
            numeric[i] = 1;
            total[i] += $i;
        }
    }
}
END {
    # re-use non-numeric columns of last line
    for (i = 1; i <= NF; ++i) {
        if (numeric[i])
            $i = total[i]
    }
    print
}
Run Code Online (Sandbox Code Playgroud)

产量:

 44 files changed, 1080 insertions(+), 338 deletions(-)
Run Code Online (Sandbox Code Playgroud)

Awk有几个简化问题的功能,如自动字符串 - >数字转换,所有数组作为关联数组,以及覆盖自动拆分位置参数然后打印等效行的功能.

这个黑客有更好的语言吗?

mob*_*mob 5

Perl - 47个字符

灵感来自ChristopheD的awk解决方案.与-an命令行开关一起使用.43个字符+ 4个字符用于命令行开关:

$i-=@a=map{($b[$i++]+=$_)||$_}@F}{print"@a"
Run Code Online (Sandbox Code Playgroud)

我可以-ap通过一点点作弊来达到45(41 + 开关):

$i=0;$_="Ctrl-M@{[map{($b[$i++]+=$_)||$_}@F]}"

较旧的,基于散列的66字符解决方案:

@a=(),s#(\d+)(\D+)#$b{$a[@a]=$2}+=$1#gefor<>;print map$b{$_}.$_,@a
Run Code Online (Sandbox Code Playgroud)