【问题标题】:calculating average using awk from multiple files使用 awk 从多个文件计算平均值
【发布时间】:2017-11-04 00:30:20
【问题描述】:

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

感谢任何帮助。 谢谢

【问题讨论】:

    标签: awk


    【解决方案1】:

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

    awk '{a[FNR]+=$2;b[FNR]++;}END{for(i=1;i<=FNR;i++)print i,a[i]/b[i];}' fort.*
    

    【讨论】:

    • 此代码是否考虑所有“所有输入文件的第一行(fort.1,fort.2...)”并计算平均值,然后转到所有文件的第二行(fort.1 , fort.2 ....) 直到每个文件的 800 行?我需要一些解释来理解这段代码的实际作用。谢谢
    • @Vijay :确实如此..用堡垒更新它。*使其更清晰。您可以针对一个小样本文件对其进行测试以确认...
    • 大师,此代码工作正常。谢谢你。另外需要添加一些小东西。我有名称为 fort.1、fort.2 等的文件。我担心如果我放 fort.*,它会变成 fort.1、fort.10、fort.100 而不是 fort.1、fort.2 等等。如何治疗?谢谢
    • @Vijay : fort.* 将读取 fort.1、fort.2、...fort.10、fort.100 等。每个文件都以 fort 开头。将被阅读,这也是我认为你想要的。
    • 如果它确实在 fort.2 之前读取了 fort.10 和 fort.100,那么对于最终平均值来说应该无关紧要。
    【解决方案2】:

    这是使用pasteawk 的快速方法:

    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.*
    

    【讨论】:

      【解决方案3】:

      假设第一列是一个 ID:

      cat fort.* | awk '{sum[$1] += $2; counts[$1]++;} END {for (i in sum) print i, sum[i]/counts[i];}' 
      

      【讨论】:

        【解决方案4】:

        我的理解:每个文件都是特定位置的一组测量值。您希望聚合所有位置的测量值,将每个文件中同一行的值平均到一个新文件中。

        假设可以将第一列视为行的 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
        }
        '
        

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

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

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

        【讨论】:

        • 在这段代码中,我理解的是,首先来自 fort.1 文件的所有值都保存在数组“total”中。接下来它会读取第二个文件 fort.2 并保存在数组中。 (例如),那么它应该分别从第一个和第二个文件中执行 (total[1] + total[1] /2) ,以获得平均值。但我不明白……如果我理解不正确,请见谅。
        • 已编辑以反映我对问题的假设。
        • 感谢您的快速回复。让我再次澄清我想要什么。每个文件(总共 500 个文件)包含两列(第一列和第二列)和 800 行。我希望添加每个文件(所有 500 个文件)的第一行第二列,并计算平均值并将其作为 average.output 存储在新文件中。然后它转到所有文件(500 个文件)的第二行第二列并计算平均值并存储在 average.output 中。它一直持续到 average.output 文件包含 800 行。希望你得到这个解释。对不起,如果我在帖子中的问题让您感到困惑。提前谢谢你。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 1970-01-01
        • 2017-02-06
        • 2014-11-03
        相关资源
        最近更新 更多