【发布时间】:2017-06-28 21:40:24
【问题描述】:
我想计算第 2 列的总和以及 15 个文件中所有其他列的平均值:- ifile1.txt、ifile2.txt、.....、ifile15.txt。每个文件的列数和行数相同。但其中一些是缺失值。部分数据看起来像
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 .
. . . . . . . . . . . . . . .
我想找到一个新文件,该文件将显示这 15 个文件中第 2 列的总和和所有其他列的平均值,而不考虑缺失值。
ofile.txt
2.66 2 1 3 . (i.e. average of 3 1 4, sum of ? 2 ?, average of ? 1 ?, average of ? 3 ?, and so on)
2.33 ? ? ? .
3 15 4.33 1.33 .
3 8 4 0.66 .
. . . . .
这个问题与我之前的问题Average of multiple files without considering missing values 相似,其中脚本是为所有列的平均值编写的。
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*
但我无法将其修改为我想要的输出。
【问题讨论】:
-
我注意到平均值没有四舍五入,这是你想要的吗?
-
@CWLiu 。是的.. 我需要 %.2f
-
不要将
...s 添加到您提供的任何示例输入/输出中 - 它不会增加任何价值,只会混淆您的问题,这意味着我们需要在测试可能的解决方案之前手动删除它.%.2f向上取整,而您发布的输出显示向下取整,因此%.2f不是您需要的(或者您发布的预期输出错误)。