Grep 多个位置 with/without ID

Grep multiple positions with/without ID

我想grep一个vcf文件来搜索多个位置。以下作品:

grep -f template_gb37 file.vcf>gb37_result

我的 template_gb37 有 10000 行,看起来像这样:

1   1156131 rs2887286   C   T
1   1211292 rs6685064   T   C
1   2283896 rs2840528   A   G

当 vcf 有 rs 时,它工作完美。

问题是我要grep的vcf可能没有rs和“.”。相反:

File.vcf

#CHROM  POS  ID  REF  ALT ....
1   1156131 .   C   T  ....
1   1211292 .   T   C  ....
1   1211292 .   T   C  ....

有没有办法用“rs”或“.”来搜索我的多个模式?

提前致谢

为此使用 awk 似乎更好,您的数据格式就是它想要的,列。首先解析(固定的)模式,保存它们,还用点而不是 rs... 创建额外的模式。然后匹配第二个文件中的行。

awk 'NR==FNR{a[    ]; a[  "."  ]; next}
     (    ) in a' template_gb37 file.vcf > gb37_result

我认为您的意思是文件中的第二个字段可以是 .rsNNNNNN,并且您想允许其中一个。所以,我认为你需要一个 "alternation" 你用 | 做的是这样的:

printf "cat\nmonkey\ndog" | grep -E "cat|dog"
cat
dog

因此您的模式文件 "template_gb37" 需要如下所示:

1   1156131 (\.)|rs2887286   C   T
1   1211292 (\.)|rs6685064   T   C
1   2283896 (\.)|rs2840528   A   G

并且您需要搜索:

grep -Ef PATTERNFILE file.vcf

如果你不想改变你的模式文件,你可以在每次使用它时编辑它"on-the-fly"。所以,如果 "template" 当前看起来像这样:

1   1156131 rs2887286   C   T
1   1211292 rs6685064   T   C
1   2283896 rs2840528   A   G

以下 awk 将对其进行编辑:

awk '{ = "(\.)|" }1' template

让它变成这样:

1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G

这意味着您可以像这样使用我的整个答案:

grep -Ef <( awk '{ = "(\.)|" }1' template ) file.vcf