如何使用awk将基因型转换为T / F -1/0/1格式?

时间:2014-04-07 15:01:04

标签: bash awk

我有一个非常大的数据集,我想从基因型转换为编码格式。基因型应表示如下:

A A -> -1
A B -> 0
B B -> 1

我用awk考虑过这个问题,但我似乎无法找到一个可以读取两列并输出单个代码来代替基因型的工作解决方案。输入文件如下所示:

AnimalID    Locus       Allele1     Allele2
1       1       A       B
1       2       A       A
1       3       B       B
2       1       B       A
2       2       B       A
2       3       A       A

应编码为输出文件,如下所示:

AnimalID Locus1 Locus2 Locus3
1 0 -1 1
2 0 0 -1

我假设这可以使用布尔T / F完成?任何建议都会受到欢迎。感谢。

1 个答案:

答案 0 :(得分:1)

这是让你入门的东西:

我已将映射存储在BEGIN块中。如果特定ID缺少基因座,则只会打印空白。你没有说明B A意味着什么,所以我冒昧地根据你的输出将它映射到0。

awk '
BEGIN { 
    map["A","A"] = -1;
    map["A","B"] =  0;
    map["B","B"] =  1;
    map["B","A"] =  0;
}
NR>1 {
    idCount = (idCount<$1) ? $1 : idCount;
    locusCount = (locusCount<$2) ? $2 : locusCount
    code[$1,$2] = map[$3,$4]
}
END {
    printf "%s ", "AnimalID"; 
    for(cnt=1; cnt<=locusCount; cnt++) { 
        printf "%s%s", "Locus" cnt, ((cnt==locusCount) ? "\n" : " ")
    }
    for(cnt=1; cnt<=idCount; cnt++) {
        printf "%s\t", cnt; 
        for(locus=1; locus<=locusCount; locus++) { 
            printf "%s%s", code[cnt,locus], ((locus==locusCount) ? "\n" : "\t")
        }
    }
}' inputFile

输出:

AnimalID Locus1 Locus2 Locus3
1       0       -1        1
2       0        0       -1