通过使用 awk/linux 在另一个文件中查找值并转换数据来创建新的文本文件
Creating a new text file by looking up values in another using awk/linux and transforming data
我有两个table:
来自 PLINK (https://www.cog-genomics.org/plink/1.9/formats#assoc_linear) 的 assoc.logistic 文件,我已将其编辑为使用 awk 的列(仅打印不同的列)。 SNP栏中的number/letters是指table中的CHROM/POS/REF/ALT栏 2.
SNP P
chr1:1243:A:T 0.14
chr5:1432:G:C 0.0006
还有数百万行
- 来自 dbSNP 的参考 table,我已将其编辑为使用 awk 的列。染色体都是这么写的,烦人不过是“.”前的数字。是染色体,即 NC_0000001.11 = 1 到 NC_000000022.11 尽管还有一些其他随机 CHROM 分配给那些线粒体或性染色体上的 SNP(我对此不感兴趣现在)。
CHROM POS ID REF ALT
NC_0000001.11 1243 rs73647921 A T
NC_0000005.11 1432 rs75444 G C
还有数亿行
我想创建如下所示的输出:
MarkerName P-value
rs73647921 0.14
rs75444 0.0006
即我想将 table 2 中的 CHROM 列转换为 chr[1-22] 格式的染色体编号 1-22,然后将 ID 与 table 1 中的 SNP 进行匹配,输出 ID和新的 table.
中的 P-value
我一直在使用 R 来执行此操作,使用字符串拆分的组合从 table 1 创建一个新数据帧,然后在 table 2 上使用 join/merge 函数,但是文件太大,需要很长时间。
到目前为止我已经尝试过:
将 table 1 转换为类似于 table 2 的格式,因为 table 2 是巨大的(7G 压缩)使用 awk(我手动删除了 headers):
awk -F":" '$1=$1' OFS="/t" table1.txt > table1_edited.txt
给我:
chr1 1243 A T 0.14
chr5 1432 G C 0.0006
然后将table1的第1列中的染色体名称更改为在table2中找到的那些名称:
awk 'FNR==NR{a[]=;next} {for (i in a)sub(i,a[i]);print' lookup_table.txt table1_edited.txt > new_table.txt
这似乎适用于那些个位数的染色体,但对于那些双位数的染色体,我得到奇怪的结果 - 查找 table 看起来像这样:
chr1 NC_0000001.11
chr2 NC_0000002.11
..
chr22 NC_0000022.11
输出上面的代码如下所示:
NC_000001.11 1243 A T 0.14 - as expected for chr1
但是如果替换的 chr 是 chr17 那么我得到:
NC_000001.117 543 G C 0.005
相对于:
NC_000017.11 543 G C 0.005
一旦我解决了这个问题并获得正确的格式,我希望使用 join 命令(我认为这是最好的?)将它们与 table2 匹配并最终得到结果rsID 和 P-value:
SNP P
chr1:1243:A:T 0.14
chr5:1432:G:C 0.0006
我想要解决此问题的命令行方法,如有任何帮助,我们将不胜感激。
祝一切顺利
您的输出值与输入数据不匹配。假设这是一个错字,如果你有足够的内存,这样的东西应该足够快
$ awk 'NR==FNR {if(NR>1) {split(,f,":"); a[f[1]]=} next}
FNR==1 {print "MarketName","P-value"; next}
{split(,f,"[_.]"); k=f[2]+0; print "rs"k, a["chr"k]}' file1 file2
将生成
MarketName P-value
rs1 0.14
rs5 0.0006
请注意,这假定了字段格式中的给定结构,并且没有尝试进行错误处理。
我有两个table:
来自 PLINK (https://www.cog-genomics.org/plink/1.9/formats#assoc_linear) 的 assoc.logistic 文件,我已将其编辑为使用 awk 的列(仅打印不同的列)。 SNP栏中的number/letters是指table中的CHROM/POS/REF/ALT栏 2.
SNP P chr1:1243:A:T 0.14 chr5:1432:G:C 0.0006
还有数百万行
- 来自 dbSNP 的参考 table,我已将其编辑为使用 awk 的列。染色体都是这么写的,烦人不过是“.”前的数字。是染色体,即 NC_0000001.11 = 1 到 NC_000000022.11 尽管还有一些其他随机 CHROM 分配给那些线粒体或性染色体上的 SNP(我对此不感兴趣现在)。
CHROM POS ID REF ALT NC_0000001.11 1243 rs73647921 A T NC_0000005.11 1432 rs75444 G C
还有数亿行
我想创建如下所示的输出:
MarkerName P-value
rs73647921 0.14
rs75444 0.0006
即我想将 table 2 中的 CHROM 列转换为 chr[1-22] 格式的染色体编号 1-22,然后将 ID 与 table 1 中的 SNP 进行匹配,输出 ID和新的 table.
中的 P-value我一直在使用 R 来执行此操作,使用字符串拆分的组合从 table 1 创建一个新数据帧,然后在 table 2 上使用 join/merge 函数,但是文件太大,需要很长时间。
到目前为止我已经尝试过:
将 table 1 转换为类似于 table 2 的格式,因为 table 2 是巨大的(7G 压缩)使用 awk(我手动删除了 headers):
awk -F":" '$1=$1' OFS="/t" table1.txt > table1_edited.txt
给我:
chr1 1243 A T 0.14
chr5 1432 G C 0.0006
然后将table1的第1列中的染色体名称更改为在table2中找到的那些名称:
awk 'FNR==NR{a[]=;next} {for (i in a)sub(i,a[i]);print' lookup_table.txt table1_edited.txt > new_table.txt
这似乎适用于那些个位数的染色体,但对于那些双位数的染色体,我得到奇怪的结果 - 查找 table 看起来像这样:
chr1 NC_0000001.11
chr2 NC_0000002.11
..
chr22 NC_0000022.11
输出上面的代码如下所示:
NC_000001.11 1243 A T 0.14 - as expected for chr1
但是如果替换的 chr 是 chr17 那么我得到:
NC_000001.117 543 G C 0.005
相对于:
NC_000017.11 543 G C 0.005
一旦我解决了这个问题并获得正确的格式,我希望使用 join 命令(我认为这是最好的?)将它们与 table2 匹配并最终得到结果rsID 和 P-value:
SNP P
chr1:1243:A:T 0.14
chr5:1432:G:C 0.0006
我想要解决此问题的命令行方法,如有任何帮助,我们将不胜感激。
祝一切顺利
您的输出值与输入数据不匹配。假设这是一个错字,如果你有足够的内存,这样的东西应该足够快
$ awk 'NR==FNR {if(NR>1) {split(,f,":"); a[f[1]]=} next}
FNR==1 {print "MarketName","P-value"; next}
{split(,f,"[_.]"); k=f[2]+0; print "rs"k, a["chr"k]}' file1 file2
将生成
MarketName P-value
rs1 0.14
rs5 0.0006
请注意,这假定了字段格式中的给定结构,并且没有尝试进行错误处理。