首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用将核苷酸作为map文件的另一个文件将文件中00、11、20中的snps更改为双等位字母等位基因

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

Stack Overflow用户
提问于 2020-09-08 04:22:06
回答 1查看 43关注 0票数 1

我有一个raw.txt文件:

代码语言:javascript
运行
复制
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文件:

代码语言:javascript
运行
复制
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中的字母之后):

代码语言:javascript
运行
复制
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列是从第7列( raw.txt )开始的文件raw.txt的标头。文件snp.txt的第4列和第5列表示第2列的SNP2的次等位基因和主要等位基因。我希望使用第4列和第5列将SNP1、SNP2、SNP3和SNP4下的0、1、2格式的列转换为ACGT格式。

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

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

代码语言:javascript
运行
复制
awk 'NR==FNR {a[$2,20]=$4$4; a[$2,11]=$4$5; a[$2,"00"]=$5$5; next} $7~/^[0-2]/ {
     $7=a["SNP1",$7]; $8=a["SNP2",$8];9=a["SNP3",$9];$10=a["SNP4",$10]}1'
snp.txt raw.txt > output.txt

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-08 06:06:53

你的awk很好!下面是如何制作数量可变的snps的方法。

代码语言:javascript
运行
复制
> cat tst.awk 
NR==FNR {
    snp[$2 "20"] = $4 $4
    snp[$2 "11"] = $4 $5
    snp[$2 "00"] = $5 $5
    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
}

用法:

代码语言:javascript
运行
复制
> 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

修改是我们读取头并保存snps,稍后我们使用它们进行映射。这两个操作都是用一个典型的for循环完成的,从我们想要的那一列到最后一列(NF),除了一些更清晰的语法之外,其余的都是您已经在做的事情。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63783769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档