Awk 将3列文件转换为矩阵格式
我有一个类似下面示例的文件格式,显示了包括他们自己在内的5个人之间的关系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将其转换为完整的矩阵格式。我需要像示例中那样对行和
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