我有很多数字表。下面只是一个示例:
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
@a
t()
andthen
$_
$_
A B C D
skip
sum
put