我想计算数据表中值的平均值
数据矩阵示例
S1 1 3 4 5 16 3 3 4 6 0
S2 1 6 4 5 16 3 4 6 6 0
S3 1 3 4 3 4 7 3 5 16 9
S4 0 0 4 5 6 0 0 4 5 6
这个想法是除以col7
, col2
bycol8
等等col3
,直到col11
bycol11
预期产出
S1 0.75 0.5 0.5 0.545455 0
S2 0.75 0.4 0.6 0.545455 0
S3 0.875 0.5 0.555556 0.842105 0.692308
S4 0 0 0.5 0.5 0.5
awk 脚本
cat TestFile | awk '{ out=$1; for(i=2;i<=6;i++) out=out"\t"$(i+5)/($i+$(i+5)); print out }'
命令输出
S1 0.75 0.5 0.5 0.545455 0
S2 0.75 0.4 0.6 0.545455 0
S3 0.875 0.5 0.555556 0.842105 0.692308
awk: cmd. line:1: (FILENAME=- FNR=4) fatal: division by zero attempted
由于除以“0”,它会抛出错误。
当被0除时,如何填充“0”而不报错。
答案1
awk '{for (i=2;i<=6;i++) $i = ($(i+5)!=0? $(i+5)/($i+$(i+5)): 0); NF=6} 1' file
我们使用一个条件表达式,我们在除法之前测试除数,如果它为零,我们就分配一个值,而不进行除法并引发错误。另外,对于仅打印前 6 列,分配NF=6
并打印记录就足够了。
Tab要对齐您的预期输出,您可以使用定义输出字段分隔符awk -v OFS='\t'
,或者可以通过管道将输出传递到colun -t
类似选项卡的外观,并填充空格。
S1 0.75 0.5 0.5 0.545455 0
S2 0.75 0.4 0.6 0.545455 0
S3 0.875 0.5 0.555556 0.842105 0.692308
S4 0 0 0.5 0.5 0.5