作为某个程序的输出我获得了多个矩阵文件(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中是可行的,但从长远来看这是非常耗时的。
答案 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