Как суммировать строки в файле TSV, используя awk? - PullRequest
0 голосов
/ 01 февраля 2019

Мой ввод:

Position   A   B   C   D   No
1   0   0   0   0   0
2   1   0   1   0   0
3   0   6   0   0   0
4   0   0   0   0   0
5   0   5   0   0   0

У меня есть файл TSV, как и выше, где я хочу суммировать строки чисел только в столбцах ABCD, а не в столбце Position.Желаемый вывод будет иметь TSV, два столбца с Position и Sum в первом ряду,

Position   Sum
1    0
2    2
3    6
4    0
5    5

Пока у меня есть:

awk 'BEGIN{print"Position\tSum"}{if(NR==1)next; sum=$2+$3+$4+$5 printf"%d\t%d\n",$sum}' infile.tsv > outfile.tsv

Ответы [ 3 ]

0 голосов
/ 01 февраля 2019

Вы были очень близки, попробуйте это:

 awk 'BEGIN{print"Position\tSum"}{if(NR==1)next; sum=$2+$3+$4+$5; printf "%d\t%d\n",$1,sum; }' infile.tsv > outfile.tsv

Но я говорю, что это намного чище с символами новой строки и пробелами:

awk '
BEGIN { 
    print"Position\tSum";
}
{  
    if (NR==1) {
        next; 
    }
    sum = $2 + $3 + $4 + $5 + $6; 
    printf "%d\t%d\n", $1, sum;
}'
0 голосов
/ 01 февраля 2019

минималистичный сценарий может быть

$ awk '{print $1 "\t" (NR==1?"Sum":$2+$3+$4+$5)}' file
0 голосов
/ 01 февраля 2019

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

awk 'FNR==1{print $1,"sum";next} {for(i=2;i<NF;i++){sum+=$i};print $1,sum;sum=""}' Input_file

Измените awk на awk 'BEGIN{OFS="\t"} остальную часть кода, если вам нужен вывод в форме TAB.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...