我有500个名字为fort.1,fort.2 ... fort.500的文件。每个文件包含800个数据,如下所示:
1 0.485
2 0.028
3 0.100
4 0.979
5 0.338
6 0.891
7 0.415
8 0.368
9 0.245
10 0.489
我想从每个文件中获取每行第二列的平均值。换句话说,从所有文件中获取第二列第一行的平均值并存储在“output.file”中。然后得到第二行第二列的平均值并存储在相同的“output.file”中。 我尝试使用粘贴命令,但未能得到我想要的。 在AWK有什么办法吗?
感谢任何帮助。 感谢
答案 0 :(得分:7)
awk没有任何关于第1栏的假设:
awk '{a[FNR]+=$2;b[FNR]++;}END{for(i=1;i<=FNR;i++)print i,a[i]/b[i];}' fort.*
答案 1 :(得分:5)
以下是使用paste
和awk
paste fort.* | awk '{ for(i=2;i<=NF;i+=2) array[$1]+=$i; if (i = NF) print $1, array[$1]/NF*2 }' > output.file
像其他一些答案一样;这是另一种方式,但是这个方法使用sort
来获得数字排序的输出:
awk '{ sum[$1]+=$2; cnt[$1]++ } END { for (i in sum) print i, sum[i]/cnt[i] | "sort -n" }' fort.*
答案 2 :(得分:2)
假设第一列是ID:
cat fort.* | awk '{sum[$1] += $2; counts[$1]++;} END {for (i in sum) print i, sum[i]/counts[i];}'
答案 3 :(得分:1)
我的理解:每个文件都是特定位置的一组测量值。您希望在所有位置聚合测量值,将每个文件中相同行的值平均为新文件。
假设可以将第一列视为行的ID(并且文件中有800个测量值):
cat fort.* | awk '
BEGIN {
for (i = 1; i <= 800; i++)
total[i] = 0
}
{ total[$1] += $2 }
END {
for (i = 1; i <= 800; i++)
print i, total[i]/500
}
'
首先,我们初始化一个数组,以存储所有文件中行的总和。
然后,我们遍历连接文件。我们使用第一列作为行的键,我们总结为数组。
最后,我们遍历数组并在所有文件中按行打印平均值。