Использование awk для вычисления среднего значения каждой строки с разным количеством столбцов

Документация обычно находится на справочных страницах и /usr/share/doc. Обычно символическая ссылка с именем ccуказывает на конкретный установленный компилятор по умолчанию, поэтому вы сможете определить, какой компилятор используется по умолчанию для вашей системы, используя man cc. Затем поищите полную документацию в Интернете или в /usr/share/docs.

2
09.10.2021, 09:37
1 ответ

Вот так:

$ awk -F',' -v OFS=',' '{ 
        s=0; 
        numFields=0; 
        for(i=2; i<=NF;i++){ 
            if(length($i)){ 
                s+=$i; 
                numFields++
            } 
        } 
        print $0, (numFields ? s/numFields : 0)}' data1.csv 
EMPLOYEE1,0.395314,0.384513,,,0.389914
EMPLOYEE2,5.4908,5.2921,,,5.39145
EMPLOYEE3,0.0002323,0.00022945,0.00023238,0.00022931,0.00023086
EMPLOYEE4,0.00335516,0.00328432,0.00340309,0.00327163,0.00332855
EMPLOYEE5,1.4816,1.4367,1.4854,1.4353,1.45975
EMPLOYEE6,7.89E-06,7.93E-06,7.95E-06,7.87E-06,7.91e-06
EMPLOYEE7,3.724E-06,3.8745E-06,3.9428E-06,3.7227E-06,3.816e-06
EMPLOYEE8,0.699498,0.688892,0.704256,0.683486,0.694033
EMPLOYEE9,33.5195,31.9736,33.6779,31.742,32.7282

Обратите внимание, что awk печатает 0.389914как результат 0.779827/2, что означает, что среднее значение в первой строке будет 0.389914, а не 0.389915. Это связано с тем, что awk будет округлять до ближайшего четного числа, а его режим печати по умолчанию (, управляемый переменной OFMT), равен %0.6g. Если вам нужна большая точность, вы можете сделать:

$ awk -F',' -v OFS=',' -v OFMT='%0.7g' '{ 
        s=0; 
        numFields=0; 
        for(i=2; i<=NF;i++){ 
            if(length($i)){ 
                s+=$i; 
                numFields++
            } 
        } 
        print $0, (numFields ? s/numFields : 0)}' data1.csv 
EMPLOYEE1,0.395314,0.384513,,,0.3899135
EMPLOYEE2,5.4908,5.2921,,,5.39145
EMPLOYEE3,0.0002323,0.00022945,0.00023238,0.00022931,0.00023086
EMPLOYEE4,0.00335516,0.00328432,0.00340309,0.00327163,0.00332855
EMPLOYEE5,1.4816,1.4367,1.4854,1.4353,1.45975
EMPLOYEE6,7.89E-06,7.93E-06,7.95E-06,7.87E-06,7.91e-06
EMPLOYEE7,3.724E-06,3.8745E-06,3.9428E-06,3.7227E-06,3.816e-06
EMPLOYEE8,0.699498,0.688892,0.704256,0.683486,0.694033
EMPLOYEE9,33.5195,31.9736,33.6779,31.742,32.72825
3
09.10.2021, 11:24

Теги

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