1

仕事の手伝いをしたいのですが、どうしたらいいのかわかりません。次のような 3 列のテキストから、距離行列を作成する必要があります。

AN51 AN50 88
AN52 AN50 167
AN52 AN51 125
AN53 AN50 81
AN53 AN51 93
AN53 AN52 170
AN54 AN50 120
AN54 AN51 119
AN54 AN52 117
AN54 AN53 66 

出力は正方形の「2d」マトリックスでなければなりません

    AN50  AN51  AN52 AN53
AN50 0     88   167   81
AN51 88    0    125   93
AN52 167   125   0    170
AN53 81    93   170    0

$0 でファイルから読み込みを試みたところ、最終的にすべてのフィールドが読み込まれましたが、配置が異なりました。

4

2 に答える 2

3
awk '
{ 
  matrix[$1,$2] = $3
  matrix[$2,$1] = $3 
} 
END { 
  printf("\tAN50\tAN51\tAN52\tAN53\n")
  for (n=0;n<4;n++) { 
    printf("AN5%d\t", n)
    for (m=0; m<4; m++) { 
      printf("%d\t", matrix["AN5"n,"AN5"m]) 
    } 
    printf("\n") 
  } 
}'
于 2012-04-28T14:11:29.773 に答える
3

これは、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")
    }
}'

予測できない順序で名前が出力されます。

于 2012-04-28T15:48:54.473 に答える