在两个大型排序文本文件中查找匹配键并比较值(VCF文件)

时间:2016-07-01 12:19:07

标签: perl unix awk bioinformatics

我正在寻找一种有效的解决方案来过滤两个数据集。基本上,我想只保留一个文件中没有丢失的行为其键列,并且没有值" 0/0"在两个文件中。

输入数据(对于那些感兴趣的人,我为此问题简化的基因组VCF文件)具有以下特征:

  • 第1列和第2列一起按数字排序,唯一标识符
  • 第3列以值0 / 0,0 / 1或1/1
  • 开头

该脚本最好执行以下操作:

  1. 遍历sample1.dat中的每一行,并在sample2.dat
  2. 中查找相同的标识符
  3. 如果在sample2.dat中找不到sample1.dat中的标识符,则不执行任何操作
  4. 如果两行包含" 0/0",则不执行任何操作
  5. 如果一行或两行不包含" 0/0",则将两行写入各自的输出
  6. INPUT

    sample1.dat

    1      1001  0/0:8:8:99:PASS
    1      1002  0/0:8:8:99:PASS
    1      1003  0/1:5,3:8:99:PASS,PASS
    2      1234  0/0:8:8:99:PASS # not present in sample2
    2      2345  1/1:8:8:99:PASS
    

    sample2.dat

    1      1001   0/0:8:8:99:PASS
    1      1002   0/1:5,3:8:99:PASS,PASS
    1      1003   0/0:8:8:99:PASS
    2      2345   1/1:8:8:99:PASS
    2      3456   0/1:8:8:99:PASS # not present in sample1
    

    输出

    sample1_out.dat

    1      1002  0/0:8:8:99:PASS
    1      1003  0/1:5,3:8:99:PASS,PASS
    2      2345  1/1:8:8:99:PASS
    

    sample2_out.dat

    1      1002   0/1:5,3:8:99:PASS,PASS
    1      1003   0/0:8:8:99:PASS
    2      2345   1/1:8:8:99:PASS
    

    在这种情况下,不会打印1-1001,因为它们都具有值" 0/0",并且不打印2-1234和2-3456,因为它们不存在于两个文件中。 / p>

    一些注意事项:

    • 这些文件大约是260GB,但是我可以轻松地将它们分成多个文件,最大18GB (基本上我将它们分成染色体)
    • 我的机器上可用的内存大约是128GB
    • 第1列和第2列已按数字顺序排序

    非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

awk救援!可能你需要先拆分文件,为每个块你可以做到这一点

$ function f { awk -v OFS='\t' '{print $1"~"$2,$0}' $1; }; 
  join <(f file1) <(f file2) | 
  awk -v OFS='\t' '$4!~/0\/0/ || $7!~/0\/0/ 
                     {print $2,$3,$4 > "file1.out"; 
                      print $5,$6,$7 > "file2.out"}'    

解释join完成匹配相应记录的工作,但需要通过合并前两个字段来创建合成密钥。输出包含我们需要的所有信息,在相应的字段中应用“0/0”逻辑,并将结果的输出部分输出到相应的输出文件。

$ head file{1,2}.out                          

==> file1.out <==                                                                                                     
1       1002    0/0:8:8:99:PASS
1       1003    0/1:5,3:8:99:PASS,PASS
2       2345    1/1:8:8:99:PASS

==> file2.out <==
1       1002    0/1:5,3:8:99:PASS,PASS
1       1003    0/0:8:8:99:PASS
2       2345    1/1:8:8:99:PASS

您可能最好还要进行参数化文件名的输入和输出。