通过使用 awk/linux 在另一个文件中查找值并转换数据来创建新的文本文件

Creating a new text file by looking up values in another using awk/linux and transforming data

我有两个table:

  1. 来自 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
    

还有数百万行

  1. 来自 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 函数,但是文件太大,需要很长时间。

到目前为止我已经尝试过:

给我:

 chr1 1243 A T 0.14 
 chr5 1432 G C 0.0006

这似乎适用于那些个位数的染色体,但对于那些双位数的染色体,我得到奇怪的结果 - 查找 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

请注意,这假定了字段格式中的给定结构,并且没有尝试进行错误处理。