AWK: Суммируйте столбцы, запишите их в «последний» ряд

Мой CSV выглядит следующим образом

A   5   3
B   3   1
...

Мне нужно получить сумму всех столбцов и добавить их в новую строку в CSV, чтобы она стала

A   5   3
B   3   1
SUM 8   4

Я был Я могу сделать вывод суммы определенного столбца, выполнив awk -F',' '{sum+=$2} END {print sum}' file.csv, но мне нужно сделать это для всей папки CSV, к которой в конечном итоге необходимо добавить сумму. Возможно также пустая строка между набором данных и столбцом «сумма», но это было бы просто бонусом.

Я программист, и я мог бы написать что-то подобное на Java, но я думаю, что AWK поможет нам быстрее.

Спасибо.

0
задан 15 July 2019 в 00:49

2 ответа

Вы могли использовать что-то вроде этого. Это работает на файлы с произвольным числом столбцов, предполагая, что первый столбец является текстом и должен иметь SUM в строке результата вместо суммы всех значений того столбца.

$ awk '{for(i=2;i<=NF;i++)a[i]+=$i;print $0} END{l="SUM";i=2;while(i in a){l=l" "a[i];i++};print l}' data.csv > final.csv
A   5   3
B   3   1
SUM 8 4

awk код отформатировал более читаемым способом:

{
    for (i=2 ; i<=NF ; i++)
        a[i] += $i
    print $0
}

END {
    l = "SUM"
    i=2
    while(i in a) {
        l = l " " a[i]
 i++
    }
    print l
}
2
ответ дан 23 October 2019 в 23:46

Найденный чем-то, что сначала не работало на меня на StackOverflow https://stackoverflow.com/a/27110024/2161301

awk -F',' '{
    print($0);
    len=split($0,a);
    if (maxlen < len) {
        maxlen=len;
    }
    for (i=1;i<=len;i++) {
        b[i]+=a[i];
    }
}

END {
    for (i=1;i<=maxlen;i++) {
        printf("%s,", b[i]);
    }
    print ""
}' data.csv >> final.csv

Это по некоторым причинам добавляет другой столбец к моим данным, но это в порядке, я могу работать с этим.

1
ответ дан 23 October 2019 в 23:46

Другие вопросы по тегам:

Похожие вопросы: