使用另一个具有核苷酸作为映射文件的文件将文件中 00、11、20 中的 snps 更改为双等位字母等位基因

Changing snps in 00, 11, 20 in a file to biallelic letter allele using another file which has the nucleotides as map file

我有一个 raw.txt 文件:

FID IID FA  MO  SEX PHENO   SNP1    SNP2    SNP3    SNP4
1   1   0   0   1   1   20  00  20  11
1   2   0   0   1   1   11  00  20  20
1   3   0   0   1   1   11  20  11  20
1   4   0   0   1   1   00  11  11  20

一个snp.txt文件:

1   SNP1    20  A   G
1   SNP2    45  T   C
1   SNP3    56  A   G
1   SNP4    80  C   G

我的输出文件应如下所示(根据 snp.txt 中的第 4 列和第 5 列将数字从第 7 列转换为 raw.txt 中的字母后):

FID IID FA  MO  SEX PHENO   SNP1    SNP2    SNP3    SNP4
1   1   0   0   1   1   AA  CC  AA  CG
1   2   0   0   1   1   AG  CC  AA  CC
1   3   0   0   1   1   AG  TT  AG  CC
1   4   0   0   1   1   GG  TC  AG  CC

文件 snp.txt 的第 2 列是文件 raw.txt 从第 7 列 (raw.txt) 开始的 headers。文件 snp.txt 的第 4 列和第 5 列表示第 2 列中 snps 的次要和主要等位基因。我希望将 SNP1、SNP2、SNP3 和 SNP4 下的 0、1、2 格式的列转换为 ACGT 格式,使用第 4 列和第 5 列作为地图。

raw.txt 的 SNP1、SNP2、SNP3 和 SNP4 列代表次要等位基因的 0,1 或 2 个拷贝(snp.txt 文件的第 4 列)。第 5 列是主要等位基因。如果SNP1是20如raw.txt,minor等位基因有2个拷贝,根据snp.txt是A,所以20应该改成AA(20中的2是minor的个数等位基因 A)。 SNP1 11 表示有 1 个次要等位基因拷贝。因此11应该是AG。 SNP1 00 表示没有次要等位基因的拷贝,只有主要等位基因。因此 00 应该是文件 snp.txt.

的 GG(第 5 列字母的 2 个副本)

事实上,我有超过 65,000 个 snps,这意味着文件 raw.txt 有那么多列。我有下面的代码(我在 Whosebug 上找到的代码,我稍微编辑了一下:

awk 'NR==FNR {a[,20]=; a[,11]=; a[,"00"]=; next} ~/^[0-2]/ {
     =a["SNP1",]; =a["SNP2",];9=a["SNP3",];=a["SNP4",]}1'
snp.txt raw.txt > output.txt

如果文件 raw.txt 只有 4 个 snps,这就是我想要的。当我有超过 65,000 个 snps 时,我不知道如何循环遍历 raw.txt 的第 7 列中的字段。我想要一个代码(最好是 awk 语言),它可以循环遍历 raw.txt 的许多列,以将 00、11、20 格式的 snps 更改为 bi-allelic 字母格式。谢谢。

你的awk不错!以下是如何为可变数量的 snps 制作它。

> cat tst.awk 
NR==FNR {
    snp[ "20"] =  
    snp[ "11"] =  
    snp[ "00"] =  
    next
}

FNR==1 { # read the columns/snps
    for (i=7;i<=NF;i++) col[i] = $i
    print
    next
}

{
    for (i=7;i<=NF;i++) $i = snp[col[i] $i]
    print
}

用法:

> awk -f tst.awk snp.txt raw.txt 
FID IID FA  MO  SEX PHENO   SNP1    SNP2    SNP3    SNP4
1 1 0 0 1 1 AA CC AA CG
1 2 0 0 1 1 AG CC AA CC
1 3 0 0 1 1 AG TT AG CC
1 4 0 0 1 1 GG TC AG CC

修改是我们读取了header并保存了snps,之后我们将它们用于映射。这两个操作都是通过典型的 for 循环完成的,从我们想要的列到最后一列 (NF),除了一些更清晰的语法之外,剩下的就是你已经在做的事情。