Добавить все столбцы по отдельности в Linux, если первый столбец имеет одинаковые записи

Добавить все столбцы по отдельности в Linux, если первый столбец имеет одинаковые записи

У меня есть этот выходной файл filename.txt

AC1481523 001 001 001 001
AC1481523 005 005 005 005
AC1481676 003 003 005 004
AC1481676 003 002 001 004

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

awk '{for (j = 1; j <= 200; j++) a[$1]+=$j} END {for(i in a) print i,a[i] }' filename.txt

Я складываю все числа в один столбец и получаю

AC1481523 24
AC1481676 25

Но я хочу

AC1481523 6 6 6 6 
AC1481676 6 5 6 8

решение1

Вот один из способов:

$ awk '{ for (j = 2; j <= NF; j++) a[$1][j]+=$j }
       END {
            for(i in a){
                printf "%s", i; 
                for(field in a[i]){ 
                    printf " %s",a[i][field] 
                } 
                print ""
            }
        }' file 
AC1481676 6 5 6 8
AC1481523 6 6 6 6

Обратите внимание, что я начал jотсчет с 2, поскольку нам не нужно 1-е поле, и до NF (количество полей) вместо 200. Таким образом, это будет работать для произвольного количества полей, пока оно >= 2. Затем скрипт использует многомерный массив ( a[$1][j]), так что для каждого первого поля есть массив всех связанных значений. Наконец, мы итерируем по массиву, печатая по мере необходимости.

Связанный контент