列からデータ行列へのawk

列からデータ行列へのawk

awk私はこのテーブルで次の解決策を探しています(列1のx名、長さが異なる列2、「;」で区切られています)。

データフレーム.txt:

name1 1;2;4;8
name2 4;5;7
name3 8
name4 11;12
namex 20;21

1存在と不在を含むこの行列に0

行列.txt:

        1 2 4 5 7 8 11 12 20 21
name1   1 1 1 0 0 1 0  0  0  0 
name2   0 0 1 1 1 0 0  0  0  0
name3   0 0 0 0 0 1 0  0  0  0
name4   0 0 0 0 0 0 1  1  0  0
namex   0 0 0 0 0 0 0  0  1  1

ベストアンサー1

Awk解決策:

awk 'BEGIN{
         h = "1 2 3 4 5 6 7 8 11 12 20 21";
         len = split(h, head);
         print "\t\t" h
     }
     {
         printf "%s\t", $1;
         for (i = 1; i <= len; i++)
             printf "%s%d", (i == 1? "" : OFS), ($2 ~ "\\<" head[i] "\\>");
         print "" 
     }' file
  • h = "1 2 3 4 5 6 7 8 11 12 20 21"-ヘッダーワイヤー
  • len = split(h, head)-h行を配列に分割しますhead。ここで、indexは開始位置でソートされた位置、1valueは分割されたキー値であり、len配列サイズを含みます。
  • print "\t\t" h- 印刷ヘッダー先行タブ付きの行
  • printf "%s\t", $1;- 最初のフィールドを印刷します。$1
  • for (i = 1; i <= len; i++)- 繰り返しheadプロジェクト
    • $2 ~ "\\<" head[i] "\\>"- 2番目のフィールドに$2現在アクセスされている項目が含まれていることを確認するhead[i]

出力:

        1 2 3 4 5 6 7 8 11 12 20 21
name1   1 1 0 1 0 0 0 1 0 0 0 0
name2   0 0 0 1 1 0 1 0 0 0 0 0
name3   0 0 0 0 0 0 0 1 0 0 0 0
name4   0 0 0 0 0 0 0 0 1 1 0 0
namex   0 0 0 0 0 0 0 0 0 0 1 1

おすすめ記事