使用另一个具有核苷酸作为映射文件的文件将文件中 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
),除了一些更清晰的语法之外,剩下的就是你已经在做的事情。
我有一个 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
),除了一些更清晰的语法之外,剩下的就是你已经在做的事情。