Awk 对于字段中的每个唯一引用,将另一个字段中的每个唯一引用转换为不同列

Awk 对于字段中的每个唯一引用,将另一个字段中的每个唯一引用转换为不同列,awk,Awk,我有一份档案 splice_region_variant,intron_variant A1CF 1 3_prime_UTR_variant A1CF 18 intron_variant A1CF 204 downstream_gene_variant A1CF 22 synonymous_variant A1CF 6 missense_variant A1CF 8 5_prime_UTR_variant A2M

我有一份档案

splice_region_variant,intron_variant    A1CF    1
3_prime_UTR_variant     A1CF    18
intron_variant  A1CF    204
downstream_gene_variant A1CF    22
synonymous_variant      A1CF    6
missense_variant        A1CF    8
5_prime_UTR_variant     A2M     1
stop_gained     A2M     1
missense_variant        A2M     15
splice_region_variant,intron_variant    A2M     2
synonymous_variant      A2M     2
upstream_gene_variant   A2M     22
intron_variant  A2M     308
missense_variant        A4GNT   1
intron_variant  A4GNT   21
5_prime_UTR_variant     A4GNT   3
3_prime_UTR_variant     A4GNT   7
此文件按
$2

对于
$2
中出现的每个唯一元素,我想在列中转换
$1
中出现的每个唯一元素,并在
$3
0
中转换相应的值(如果不存在记录)。因此,我:

            splice_region_variant,intron_variant  3_prime_UTR_variant intron_variant downstream_gene_variant synonymous_variant missense_variant 5_prime_UTR_variant stop_gained upstream_gene_variant
    A1CF    1 18 204 22 6 8  0 0 0
    A2M     2 0  308 0  2 15 1 1 22
    A4GNT   0 7  21  0  0 22 3 0 0 
测试文件:

a       x       2
b,c     x       4
dd      x       3
e,e,t   x       5
a       b       1
cc      b       2
e,e,t   b       1
这就是我得到的:

        a       b,c     dd      e,e,t   cc

x       5               2       4       3
b       1       2       1
编辑:这可能正在执行,但不会在空白字段中输出
0
s

'BEGIN {FS = OFS = "\t"}
    NR > 1 {data[$2][$1] = $3; blocks[$1]}
    END {
        PROCINFO["sorted_in"] = "@ind_str_asc"

        # header
        printf "gene"
        for (block in blocks) {
            printf "%s%s", OFS, block
        }
        print ""

        # data
        for (ts in data) {
            printf "%s", ts
            for (block in blocks) {
                printf "%s%s", OFS, data[ts][block]
            }
            print ""
        }
    }' file

修改自

如果要打印
0
如果缺少某个值,可以执行以下操作:

val = data[ts][block] ? data[ts][block] : 0;
printf "%s%s", OFS, val

请指定您一直面临的错误以及您试图解决的问题。另外,您发布的代码越少,就越有可能有人会查看它——因此我建议尝试创建一个较小的示例。谢谢您的建议。更新到我最近的测试和示例文件。