8

我有 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有什么办法吗?

感谢任何帮助。谢谢

4

4 回答 4

8

awk 在第一列没有任何假设:

awk '{a[FNR]+=$2;b[FNR]++;}END{for(i=1;i<=FNR;i++)print i,a[i]/b[i];}' fort.*
于 2012-11-07T06:26:12.580 回答
5

paste这是使用and的快速方法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.*
于 2012-11-07T06:19:49.653 回答
3

假设第一列是一个 ID:

cat fort.* | awk '{sum[$1] += $2; counts[$1]++;} END {for (i in sum) print i, sum[i]/counts[i];}' 
于 2012-11-07T06:10:19.103 回答
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
}
'

首先,我们初始化一个数组来存储所有文件中一行的总和。

然后,我们遍历连接的文件。我们使用第一列作为该行的键,然后将总和放入数组中。

最后,我们遍历数组并在所有文件中逐行打印平均值。

于 2012-11-07T06:06:39.423 回答