これは、Michael Barber の回答のより一般的なバージョンであり、一般に、任意の数の列と行で機能します。
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
あなたのサンプル入力データは、完全なデータを含む、私が示した出力を生成することに注意してください。また、マイケルの回答は、サンプル出力に含まれる不完全なもののみを出力することに注意してください。
編集:
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")
}
}'
予測できない順序で名前が出力されます。