gpt4 book ai didi

linux - 具有不同行大小的多个文件的平均值

转载 作者:行者123 更新时间:2023-12-03 09:57:53 25 4
gpt4 key购买 nike

我有几个不同行大小的文件,但每个文件中的列数是相同的。例如
文件1.txt

1       1001    ?       ?
2 1002 ? ?
3 1003 ? ?
4 1004 ? ?
5 1005 ? 0
6 1006 ? 1
7 1007 ? 3
8 1008 5 4
9 1009 3 11
10 1010 2 9
文件2.txt
1       2001    ?       ?
2 2002 ? ?
3 2003 ? ?
4 2004 ? ?
5 2005 ? 0
6 2006 6 12
7 2007 6 5
8 2008 9 10
9 2009 3 12
10 2010 5 7
11 2011 2 ?
12 2012 9 ?
文件3.txt
1       3001    ?       ?
2 3002 ? 6
3 3003 ? ?
4 3004 ? ?
5 3005 ? 0
6 3006 1 25
7 3007 2 3
8 3008 ? ?
在每个文件中,第一列表示索引号,第二列表示 ID。
我想从第 3 列开始计算每个索引号的平均值。
所需的输出:
1       ?       ?      ----  [Here ? is computed from ?, ?, ?] So answer is ?
2 ? 6.0 ---- [Here 6 is computed from ?, ?, 6] So answer is 6/1=6.0
3 ? ?
4 ? ?
5 ? 0.0
6 3.5 12.7
7 4.0 3.7
8 7.0 7.0 ----- [Here 7 is computed from 5, 9, ? ] So answer is 14/2=7.0
9 3.0 11.5
10 3.5 8.0
11 2.0 ?
12 9.0 ?

最佳答案

您可以解析文件并将每个位置的总和和计数存储在某种二维数组中,这对于 awk 来说并不存在,但可以使用适当的索引字符串来实现,另见:https://www.gnu.org/software/gawk/manual/html_node/Multidimensional.html
这是一个使用您的示例输入和输出进行测试的脚本。

{
c = NF
if (r<FNR) r = FNR

for (i=3;i<=NF;i++) {
if ($i != "?") {
s[FNR "," i] += $i
n[FNR "," i] += 1
}
}
}

END {
for (i=1;i<=r;i++) {
printf("%s\t", i)
for (j=3;j<=c;j++) {
if (n[i "," j]) {
printf("%.1f\t", s[i "," j]/n[i "," j])
} else {
printf("?\t")
}
}
printf("\n")
}
}
测试
> awk -f test.awk file1 file2 file3
1 ? ?
2 ? 6.0
3 ? ?
4 ? ?
5 ? 0.0
6 3.5 12.7
7 4.0 3.7
8 7.0 7.0
9 3.0 11.5
10 3.5 8.0
11 2.0 ?
12 9.0 ?

关于linux - 具有不同行大小的多个文件的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62771504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com