Автоматически суммировать числовые столбцы и печатать итоги - PullRequest
8 голосов
/ 18 ноября 2010

Учитывая вывод 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(-)

Я хотел получить сумму числовых столбцов, но сохранить форматирование строки. В целях общности я создал скрипт 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
}

Выход:

 44 files changed, 1080 insertions(+), 338 deletions(-)

Awkимеет несколько функций, которые упрощают задачу, таких как автоматическое преобразование строк-> чисел, все массивы как ассоциативные массивы, а также возможность перезаписывать автоматически разделенные позиционные параметры и затем печатать эквивалентные строки.

Есть ли лучший языкза этот взлом?

Ответы [ 11 ]

0 голосов
/ 19 ноября 2010

Haskell - 151 135 байтов

import Char
c a b|all isDigit(a++b)=show$read a+read b|True=a
main=interact$unwords.foldl1(zipWith c).map words.filter(not.null).lines

... но я уверен, что это можно сделать лучше / меньше.

...