对数字表中的行和列求和

对数字表中的行和列求和

我有很多数字表。下面只是一个示例:

A 25 27 50 
B 35 37 75 
C 75 78 80 
D 99 88 76 

我想对每个表中的行和列进行求和以进行进一步处理,因此输出如下所示:

A 25 27 50 102
B 35 37 75 147
C 75 78 80 233
D 99 88 76 263
234 230 281

我该怎么做?我尝试过awk但没有成功。

答案1

一般情况下,您需要执行以下操作:

awk '{ sumrows=0;
    for (i=2; i<=NF; i++) {
        sumcols[i]+= $i; sumrows+= $i 
    }; print $0, sumrows+0
}
END { for (x in sumcols)
         { printf SEP sumcols[x]+0; SEP=OFS };
     print ""
}' infile

sumcols[i]+= $i部分是对同一列位置的字段值进行求和;并sumrows+= $i在相同的行位置进行求和,然后在用print $0, sumrows;读取每一行后打印行。

并在END循环中苏姆科尔斯数组并用于printf单行打印。设置SEP为默认值F产量S用于第二次打印到下一次打印的分隔符,以便在每次打印之间添加一个空格。

答案2

你可以尝试这个命令:

awk '{sum2+=$2; sum3+=$3; sum4+=$4} END {print sum2,sum3,sum4}''{print $0, $2+$3+$4}' file
A 25 27 50 102
B 35 37 75 147
C 75 78 80 233
D 99 88 76 263
234 230 281

答案3

使用(以前称为 Perl_6)

~$ raku -e 'my @a = lines; put( $_, .words.skip.sum) for @a; #rowsums \
           [Z] @a.map(*.words) andthen .skip.map(*.sum).put; #colsums'   file

输入示例:

A 25 27 50 
B 35 37 75 
C 75 78 80 
D 99 88 76

示例输出:

A 25 27 50 102
B 35 37 75 147
C 75 78 80 233
D 99 88 76 263
234 230 281

在第一个;分号分隔的语句中,@a数组是通过读入创建的lines(Raku 的lines例程 autochomps,删除\n换行符)。在第二个语句中,@a使用后缀形式迭代数组for @a:主题put$_主题变量,后跟words.skip.sum,表示空格分隔的words(即列)已sum逐行 -med,skip-ping 第一个(字母)列。 (此行和put作为最后一列。仅供参考,skip默认为一行/元素等参数,如中所示skip(1))。

在第三个语句中,通过拉出数组元素并将它们组合起来@a重新排列数组。基本上这相当于 R 的转换函数,它交换行和列。从那里开始,Raku 的控制字用于重新加载主题变量,第一个元素(字母行)为-ped,其余行为-med,最后一行(作为列总和)。[Z]word@at()andthen$_$_A B C Dskipsumput

https://raku.org

相关内容