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
我想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