Awk 将3列文件转换为矩阵格式

Awk 将3列文件转换为矩阵格式,awk,Awk,我有一个类似下面示例的文件格式,显示了包括他们自己在内的5个人之间的关系 1 1 1.0 2 1 0.5 3 1 0.1 4 1 0.3 5 1 0.1 2 2 1.0 3 2 0.5 4 2 0.2 5 2 0.3 3 3 1.0 4 3 0.5 5 3 0.3 4 4 1.0 5 4 0.1 5 5 1.0 我想使用AWK将其转换为完整的矩阵格式。我需要像示例中那样对行和

我有一个类似下面示例的文件格式,显示了包括他们自己在内的5个人之间的关系

1   1   1.0
2   1   0.5
3   1   0.1
4   1   0.3
5   1   0.1
2   2   1.0
3   2   0.5
4   2   0.2
5   2   0.3
3   3   1.0
4   3   0.5
5   3   0.3
4   4   1.0
5   4   0.1
5   5   1.0
我想使用AWK将其转换为完整的矩阵格式。我需要像示例中那样对行和列进行数字排序

    1   2   3   4   5
1   1.0 0.5 0.1 0.3 0.1
2   0.5 1.0 0.5 0.2 0.3
3   0.1 0.5 1.0 0.5 0.3
4   0.3 0.2 0.5 1.0 0.1
5   0.1 0.3 0.3 0.1 1.0
我遇到了前面的一个线程(如下),但输入文件的格式略有不同,我正在努力调整它。

如何执行此转换?

现在开始,gawk解决方案:

矩阵化.awk脚本:

#!/bin/awk -f
BEGIN { OFS="\t" }     # output field separator
{
    b[$1];             # accumulating unique indices
    if ($1 != $2) {   
        a[$2][$1] = $3 # set `diagonal` relation between different indices 
    } 
    a[$1][$2] = $3     # multidimensional array (reflects relation `one-to-many`)
}
END {
    asorti(b); h = "";  # sort unique indices
    for (i in b) {
        h = h OFS i     # form header columns
    } 
    print h;            # print header column values
    for (i in b) { 
        row = i;        # index column
        # iterating through the row values (for each intersection point)
        for (j in a[i]) {
            row = row OFS a[i][j]
        } 
        print row  
    }
}
用法

awk -f matrixize.awk yourfile
输出:

    1   2   3   4   5
1   1.0 0.5 0.1 0.3 0.1
2   0.5 1.0 0.5 0.2 0.3
3   0.1 0.5 1.0 0.5 0.3
4   0.3 0.2 0.5 1.0 0.1
5   0.1 0.3 0.3 0.1 1.0

由于上下三角形是相同的,将每个元素对复制到多维数组中的两个索引是否不够,例如:

解析.awk

输出:

1.0 0.5 0.1 0.3 0.1 
0.5 1.0 0.5 0.2 0.3 
0.1 0.5 1.0 0.5 0.3 
0.3 0.2 0.5 1.0 0.1 
0.1 0.3 0.3 0.1 1.0

注意,这假设最后一行包含最大的索引。

A
E
是否代表真实数据中的键?是否需要在输出中按字母顺序排列?A到E的实际值是数字(10到13位),是的,需要按数字顺序排列。这是有用的信息,因此应该进入您的问题。也可以更新您的示例,因此使用数字而不是字母(它们显然不必包含这么多数字!)。数字排序将打破字母的顺序
A B C D E
,因此在上次编辑后,字母应该排序,而不是数字(以获得矩阵),输入和输出已经无法理解了,谢谢你。它运行了,但我似乎得到了一个不同的ID顺序,你有什么?输入文件按您指定的制表符分隔。4 5 1 2 3 4 1.0 0.1 0.3 0.2 0.5 5 0.1 1.0 0.1 0.3 0.3 1 0.3 0.1 1.0 0.5 0.1 2 0.2 0.3 0.5 1.0 0.5 3 0.5 0.3 0.1 0.5 1.0@roddy,我已经按原样使用了您问题的输入。我正在获得预期的输出(作为您期望的输出)。检查您的文件是否有前导空格/制表符(在第一列之前)Thor,上下两列相同我可以使用任何一种方法。我现在将在一个大文件(9000 x 9000)上测试它们,看看哪一个更快。像往常一样感谢大家的帮助。在我的真实数据集上测试代码后,它看起来需要ID的编号从1向上排列。嗨,在真实数据集上测试代码后,它看起来需要ID的编号从1向上排列。我的真实身份证从8位以上的数字开始,即62243121。如何将第1列和第2列重新编号为从1开始,但确保第1列中相同id的重新编号与第2列中相同?再次感谢,Roddy@roddy我没有按照你的要求做。我认为你应该发布一个新问题,使输入/输出与你的实际数据更好地对应。
awk -f parse infile
1.0 0.5 0.1 0.3 0.1 
0.5 1.0 0.5 0.2 0.3 
0.1 0.5 1.0 0.5 0.3 
0.3 0.2 0.5 1.0 0.1 
0.1 0.3 0.3 0.1 1.0