按元素平均矩阵

时间:2018-04-16 18:23:36

标签: bash awk

作为某个程序的输出我获得了多个矩阵文件(1,2,... 10)

我想知道是否可以轻松选择一些矩阵(即1和3),并获得平均矩阵:

1 =  2 4 1/  
     1 4 1
2 =  1 2 1/
     1 2 1
average = 1,5 4 1/
          1   2 1

我知道这在excel中是可行的,但从长远来看这是非常耗时的。

2 个答案:

答案 0 :(得分:0)

如果您将此脚本保存到col_avg.awk

FNR==1 && rows {
    # Compute average per column (same as END block)
    for(i=1;i<=cols;i++) {
        if(out) out = out OFS
        out = out (sum[i]/rows)
    }
    print out
    # Reset state for the new file
    cols = 0; rows = 0; delete sum; out = ""
}
#FNR==1 { next }      # uncomment this to skip first line in each file
cols && cols!=NF {
    print "ERROR: not equal number of elements, line: " NR ", file: " FILENAME
    exit
}
{
    rows++
    cols = NF
    for(i=1;i<=NF;i++)
        sum[i] += $i
}
END {
    for(i=1;i<=cols;i++) {
        if(out) out = out OFS
        out = out (sum[i]/rows)
    }
    print out
}

你可以像这样使用它:

awk -f col_avg.awk file1 file2 fileN

例如:

的1.txt

2 4 1
1 4 1

2.txt

1 2 1
1 2 1

命令:

awk -f col_avg.awk 1.txt 2.txt

输出:

1.5 4 1
1 2 1

P.S。请考虑选择&#34;最佳答案&#34;如果答案适合你。我从你的历史中看到你以前从未这样做过。你应该。

答案 1 :(得分:0)

读取矩阵,将信息添加到相应的单元格,最后打印每个单元格的总和除以矩阵的数字。 我在打印格式中将其格式化为float,以避免像1/3

这样的小数部分过长
awk '
     # avoid emply line
   /^$/ {next}
     # start a new matrix (init)
   /^[0-9]/ { Cnt +=1;Row = 0; sub( /^.*= */,""); if( ! Col) Col = NF }
     # add each element to the corresponding cell
   { sub(/\//,"");Row++; for( i=1;i<=NF;i++) M[ Row ":" i ] += $i  }

     # display the result
   END{
     for(R=1;R<=Row;R++){
        for( i=1;i<=Col;i++) printf( "%.2f ", M[ R ":"  i] / Cnt)
        print R<Row ? "/" : ""
        }
     }' YourFile

对于多个文件,只需用文件列表替换YourFile即可。您还可以流式传输文件/批处理并将输出传递给awk