0

例如,我有一个 SNP 列表(我们称之为file1):

SNP_ID      chr position   
rs9999847   4   182120631
rs999985    11  107192257
rs9999853   4   148436871
rs999986    14  95803856
rs9999883   4   870669
rs9999929   4   73470754
rs9999931   4   31676985
rs9999944   4   148376995
rs999995    10  78735498
rs9999963   4   84072737
rs9999966   4   5927355
rs9999979   4   135733891

对于不同的表型,我有另一个具有相应 P 值 (P) 和 BETA(如下所示)的 SNP 列表,这里我只显示了一个(我们称之为file2):

CHR SNP         BP      A1 TEST NMISS   BETA    SE      L95     U95     STAT    P
1   rs3094315   742429  G   ADD 1123    0.1783  0.2441  -0.3    0.6566  0.7306  0.4652
1   rs12562034  758311  A   ADD 1119    -0.2096 0.2128  -0.6267 0.2075  -0.9848 0.3249
1   rs4475691   836671  A   ADD 1111    -0.006033 0.2314 -0.4595 0.4474 -0.02608 0.9792
1   rs9999847   878522  A   ADD 1109    -0.2784 0.4048  -1.072  0.5149  -0.6879 0.4916
1   rs999985    890368  C   ADD 1111    0.179   0.2166  -0.2455 0.6034  0.8265  0.4087
1   rs9999853   908247  C   ADD 1110    -0.02015 0.2073 -0.4265 0.3862  -0.09718 0.9226
1   rs999986    918699  G   ADD 1111    -1.248  0.7892  -2.795  0.2984  -1.582  0.114

现在我想制作两个名为的文件file3file4这样:

file3应包含:

SNPID    Pvalue_for_phenotype1   Pvalue_for_phenotype2   Pvalue_for_phenotype3 and so on....
rs9999847 0.9263                 0.00005                 0.002                ..............

第一列(SNPID)file3将被修复(我的芯片中的所有snp都将在此处列出),我想编写一个程序,以便它匹配snp idfile3file2获取相应snp的P值id 并将其从file2.

file4应包含:

SNPID    BETAvale_for_phenotype1     BETAvale_for_phenotype2     BETAvale_for_phenotype3 .........
rs9999847 0.01812                       -0.011                            0.22

中的第一列(SNPID)file4将被固定(我的芯片中的所有 SNP 都将在此处列出),我想编写一个程序,以便它匹配 SNP IDfile4file2获取相应 SNP ID 的 BETA 和把它file4file2.

4

1 回答 1

0

这是一个关于如何将列的数据传输到行(使用 awk)的简单练习?

文件 2 到文件 3。

我假设您的机器具有大 RAM,因为我认为您在 file2 中有数百万行。

您可以将此代码保存到 column2row.awk 文件中:

#!/usr/bin/awk -f                                                        

BEGIN {
    snp=2
    val=12
}

{
    if ( vector[$snp] )
        vector[$snp] = vector[$snp]","$val
    else
        vector[$snp] = $val
}

END {
    for (snp in vector)
        print snp","vector[snp]
}

其中 snp 是第 2 列,val 是第 12 列(pvalue)。现在你可以运行脚本:

/usr/bin/awk -f column2row.awk file2 > file3

如果您的 RAM 较小,则可以划分负载:

cat file1 | while read l; do s=$(echo $l|awk '{print $1}'); grep -w $s file2 > $s.snp; /usr/bin/awk -f column2row.awk $s.snp >> file3; done

它从 $l(行)第一个参数($s,snp 名称)中恢复,在 file2 中搜索 $s 并创建有关每个 snp 名称的小文件。然后它使用 awk 脚本生成 file3。

文件 2 到文件 4。

您可以将关于 val 的值从第 12 列修改为 awk 脚本到第 7 列。

于 2012-07-16T21:08:27.920 回答