我正在寻找一种有效的解决方案来过滤两个数据集。基本上,我想只保留一个文件中没有丢失的行为其键列,并且没有值" 0/0"在两个文件中。
输入数据(对于那些感兴趣的人,我为此问题简化的基因组VCF文件)具有以下特征:
该脚本最好执行以下操作:
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>
一些注意事项:
非常感谢任何帮助!
答案 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
您可能最好还要进行参数化文件名的输入和输出。