Это более общая версия ответа Майкла Барбера, которая будет работать, как правило, с любым количеством столбцов и строк.
awk '
BEGIN {
OFS = "\t"
}
{
matrix[$1,$2] = $3
matrix[$2,$1] = $3
names[$1] = $1
names[$2] = $2
}
END {
num = asort(names)
for (i = 1; i <= num; i++) {
printf("%s%s", OFS, names[i])
}
printf("\n")
for (i = 1; i <= num; i++) {
printf("%s", names[i])
for (j = 1; j <= num; j++) {
printf("%s%4d", OFS, matrix[names[i], names[j]])
}
printf("\n")
}
}'
Пример вывода:
AN50 AN51 AN52 AN53 AN54
AN50 0 88 167 81 120
AN51 88 0 125 93 119
AN52 167 125 0 170 117
AN53 81 93 170 0 66
AN54 120 119 117 66 0
Обратите внимание, что образцы входных данных дает выход я показал, который включает в себя полные данные в нем. Обратите внимание также, что ответ Майкла выводит только то, что включает в себя ваш выборка, который является неполным.
Edit:
Вот версия, которая не требует asort()
и должны работать на не-GNU версии AWK:
awk '
BEGIN {
OFS = "\t"
}
{
matrix[$1,$2] = $3
matrix[$2,$1] = $3
names[$1] = $1
names[$2] = $2
}
END {
for (i in names) {
printf("%s%s", OFS, i)
}
printf("\n")
for (i in names) {
printf("%s", i)
for (j in names) {
printf("%s%4d", OFS, matrix[i,j])
}
printf("\n")
}
}'
Он будет печатать имена в непредсказуемом порядке.
спасибо! Это была большая помощь :) – JohnnnnnY