不考虑缺失值的多个文件的平均值

我想计算15个文件的平均值: – ifile1.txt,ifile2.txt,…..,ifile15.txt。 每个文件的列数和行数是相同的。 但其中一些缺less价值。 部分数据看起来像

ifile1.txt ifile2.txt ifile3.txt 3 ? ? ? . 1 2 1 3 . 4 ? ? ? . 1 ? ? ? . 1 ? ? ? . 5 ? ? ? . 4 6 5 2 . 2 5 5 1 . 3 4 3 1 . 5 5 7 1 . 0 0 1 1 . 4 3 4 0 . . . . . . . . . . . . . . . . 

我想find一个新的文件,将显示这15个文件的平均值,而不考虑缺失值。

  ofile.txt 2.66 2 1 3 . (ie average of 3 1 4, average of ? 2 ? and so on) 2.33 ? ? ? . 3 5 4.33 1.33 . 3 2.67 4 0.66 . . . . . . 

这个问题类似于我之前提到的脚本所在shell的多个文件的平均值

 awk 'FNR == 1 { nfiles++; ncols = NF } { for (i = 1; i < NF; i++) sum[FNR,i] += $i if (FNR > maxnr) maxnr = FNR } END { for (line = 1; line <= maxnr; line++) { for (col = 1; col < ncols; col++) printf " %f", sum[line,col]/nfiles; printf "\n" } }' ifile*.txt 

但我无法修改它。

 awk ' { for (i = 1;i <= NF;i++) { Sum[FNR,i]+=$i Count[FNR,i]+=$i!="?" } } END { for( i = 1; i <= FNR; i++){ for( j = 1; j <= NF; j++) printf "%s ", Count[i,j] != 0 ? Sum[i,j]/Count[i,j] : "?" print "" } } ' ifile* 

假设文件被正确地加载(没有尾随空行,…)

用这个:

 paste ifile*.txt | awk '{n=f=0; for(i=1;i<=NF;i++){if($i*1){f++;n+=$i}}; print n/f}' 
  • paste将并排显示所有文件
  • awk计算每行的平均值:
    • n=f=0; 将变量设置为0。
    • for(i=1;i<=NF;i++)循环遍历所有字段。
    • if($i*1)如果该字段包含一个数字(乘以1将成功)。
    • f++;n+=$i增加f (数字字段的数量)并且总和n
    • print n/f计算n/f
 awk 'FNR == 1 { nfiles++; ncols = NF } { for (i = 1; i < NF; i++) if ( $i != "?" ) { sum[FNR,i] += $i ; count[FNR,i]++ ;} if (FNR > maxnr) maxnr = FNR } END { for (line = 1; line <= maxnr; line++) { for (col = 1; col < ncols; col++) if ( count[line,col] > 0 ) printf " %f", sum[line,col]/count[line,col]; else printf " ? " ; printf "\n" ; } }' ifile*.txt 

我只是检查'?' …