如何将熔融格式距离表转换为对称距离矩阵(awk执行卡住)
原有awk命令的问题
- 功能逻辑完全偏离需求:该命令原本的设计目标是统计文件中单行最大字段数,再给所有行末尾补0对齐到该字段长度,完全没有实现长表转对称矩阵、对角线置0、距离值对称填充的核心逻辑,根本不可能产出目标距离矩阵。
- 死循环原因:END块中硬编码了
getline<"file"读取文件,没有替换为实际的输入文件名,也没有做文件读取结束的判断逻辑,一旦找不到对应文件、或者读取到文件尾后没有正确终止循环,就会一直卡住无输出。 - 变量引用错误:END块里直接使用的
NF是awk处理完最后一行时留存的字段数,不是getline每次读到新行对应的字段数,就算能正常读到文件,补0的计算逻辑也是错误的。
正确实现方案
你的输入长表是典型的仅存储距离矩阵上三角非对角值的长格式:Var列值为行号i,每个i对应的score依次是i和i+1、i+2...n的距离,n为矩阵总维度(从样例数据可判断n=6)。
直接使用下面的awk命令即可完成转换,输出完全匹配给出的目标对称矩阵:
NR==1{next} { i=$1 cnt[i]++ j=i+cnt[i] d[i][j]=d[j][i]=$2 n=(j>n)?j:n } END{ printf "%6s","" for(j=1;j<=n;j++) printf "%6d",j print "" for(i=1;i<=n;i++){ printf "%6d",i for(j=1;j<=n;j++){ v = (i==j)?0.00:d[i][j] printf "%6.2f",v } print "" } }
运行方法:把长格式数据存为input.txt,直接执行单行命令即可得到结果:awk '{if(NR==1)next;i=$1;cnt[i]++;j=i+cnt[i];d[i][j]=d[j][i]=$2;n=(j>n)?j:n}END{printf "%6s","";for(j=1;j<=n;j++)printf "%6d",j;print "";for(i=1;i<=n;i++){printf "%6d",i;for(j=1;j<=n;j++){v=(i==j)?0.00:d[i][j];printf "%6.2f",v}print ""}}' input.txt
输出对角线固定为0.00,完全满足距离矩阵对称特性。
内容的提问来源于stack exchange,提问作者kashiff007
相关产品推荐
相关产品推荐

