【问题标题】:AWK (or something else) Average of multiple columns from multiple filesAWK(或其他)来自多个文件的多个列的平均值
【发布时间】:2016-07-31 18:33:32
【问题描述】:

我将不胜感激有关 awk 脚本的帮助,或者任何可以完成这项工作的东西。

所以,我有多个文件(行数和列数相同),我想对所有文件中每一列(第一列除外)中的每个数字求平均值。我不知道一个文件中有多少列(尽管如果需要我可能会得到这个数字)。

文件名.1

1 1 2 3 4
2 3 4 5 6
3 2 3 5 6

文件名.2

1 3 4 6 6
2 5 6 7 8
3 4 5 7 8

输出

1 2 3 5 5
2 4 5 6 7
3 3 4 6 7

我在这里的某个地方找到了这个,它只针对一个列(据我了解

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

所以只有一个?更改是用所有列的循环替换 +=$2 吗?有没有办法在不知道确切列数的情况下做到这一点?

谢谢。

【问题讨论】:

    标签: linux bash awk


    【解决方案1】:
    $ cat tst.awk
    {
        key[FNR] = $1
        for (colNr=2; colNr<=NF; colNr++) {
            sum[FNR,colNr] += $colNr
        }
    }
    END {
        for (rowNr=1; rowNr<=FNR; rowNr++) {
            printf "%s%s", key[rowNr], OFS
            for (colNr=2; colNr<=NF; colNr++) {
                printf "%s%s", int(sum[rowNr,colNr]/ARGIND+0.5), (colNr<NF ? OFS : ORS)
            }
        }
    }
    
    $ awk -f tst.awk file1 file2
    1 2 3 5 5
    2 4 5 6 7
    3 3 4 6 7
    

    上面使用 GNU awk 作为 ARGIND,其他 awk 只需在开头添加一行 FNR==1{ARGIND++}

    【讨论】:

    • 哈,我很惊讶这实际上适用于提供的示例,因为我发现我在 file.2 中犯了一个错误。修复后,只需使用 sum[rowNr,colNr]/ARGIND 也可以为实数提供正确的结果。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    • 1970-01-01
    相关资源
    最近更新 更多