我有一个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列是从第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上找到的代码,我稍微编辑了一下:
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更改为双等位字母格式。谢谢。
发布于 2020-09-08 06:06:53
你的awk
很好!下面是如何制作数量可变的snps的方法。
> 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
}
用法:
> 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
),除了一些更清晰的语法之外,其余的都是您已经在做的事情。
https://stackoverflow.com/questions/63783769
复制相似问题