Bash Grep有/没有ID的多个职位
我想grep一个vcf文件来搜索多个职位。以下工作:Bash Grep有/没有ID的多个职位,bash,awk,grep,pattern-matching,vcf-variant-call-format,Bash,Awk,Grep,Pattern Matching,Vcf Variant Call Format,我想grep一个vcf文件来搜索多个职位。以下工作: grep -f template_gb37 file.vcf>gb37_result 我的模板_gb37有10000行,如下所示: 1 1156131 rs2887286 C T 1 1211292 rs6685064 T C 1 2283896 rs2840528 A G printf "cat\nmonkey\ndog" | grep -E "cat|dog&qu
grep -f template_gb37 file.vcf>gb37_result
我的模板_gb37有10000行,如下所示:
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
printf "cat\nmonkey\ndog" | grep -E "cat|dog"
cat
dog
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
grep -Ef <( awk '{$3 = "(\\.)|" $3}1' template ) file.vcf
当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[$1 $2 $3 $4 $5]; a[$1 $2 "." $4 $5]; next}
($1 $2 $3 $4 $5) in a' template_gb37 file.vcf > gb37_result
似乎最好使用
awk
为此,您的数据格式就是它想要的,列。首先解析(固定的)模式,保存它们,并用点而不是rs..创建额外的模式。
。然后匹配第二个文件中的行
awk 'NR==FNR{a[$1 $2 $3 $4 $5]; a[$1 $2 "." $4 $5]; next}
($1 $2 $3 $4 $5) in a' template_gb37 file.vcf > gb37_result
我认为您的意思是文件中的第二个字段可以是
或rsnnnn
,您希望允许这两个字段中的任何一个。因此,我认为您需要一个“替换”,您可以用
这样做:
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
printf "cat\nmonkey\ndog" | grep -E "cat|dog"
cat
dog
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
grep -Ef <( awk '{$3 = "(\\.)|" $3}1' template ) file.vcf
因此,您的模式文件“template_gb37”
需要如下所示:
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
printf "cat\nmonkey\ndog" | grep -E "cat|dog"
cat
dog
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
grep -Ef <( awk '{$3 = "(\\.)|" $3}1' template ) file.vcf
您需要使用以下工具进行搜索:
grep -Ef PATTERNFILE file.vcf
如果不想更改图案文件,可以在每次使用时“动态”编辑它。因此,如果
“模板”
当前看起来像这样:
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
printf "cat\nmonkey\ndog" | grep -E "cat|dog"
cat
dog
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
grep -Ef <( awk '{$3 = "(\\.)|" $3}1' template ) file.vcf
以下awk
将对其进行编辑:
awk '{$3 = "(\\.)|" $3}1' template
为此:
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
也就是说,你可以用我的全部答案:
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
printf "cat\nmonkey\ndog" | grep -E "cat|dog"
cat
dog
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
grep -Ef <( awk '{$3 = "(\\.)|" $3}1' template ) file.vcf
grep-Ef我认为您的意思是文件中的第二个字段可以是
或rsNNNNNN
,您希望允许其中一个。因此,我认为您需要一个“替换”,您可以用
这样做:
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
printf "cat\nmonkey\ndog" | grep -E "cat|dog"
cat
dog
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
grep -Ef <( awk '{$3 = "(\\.)|" $3}1' template ) file.vcf
因此,您的模式文件“template_gb37”
需要如下所示:
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
printf "cat\nmonkey\ndog" | grep -E "cat|dog"
cat
dog
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
grep -Ef <( awk '{$3 = "(\\.)|" $3}1' template ) file.vcf
您需要使用以下工具进行搜索:
grep -Ef PATTERNFILE file.vcf
如果不想更改图案文件,可以在每次使用时“动态”编辑它。因此,如果“模板”
当前看起来像这样:
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
printf "cat\nmonkey\ndog" | grep -E "cat|dog"
cat
dog
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
grep -Ef <( awk '{$3 = "(\\.)|" $3}1' template ) file.vcf
以下awk
将对其进行编辑:
awk '{$3 = "(\\.)|" $3}1' template
为此:
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
也就是说,你可以用我的全部答案:
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
printf "cat\nmonkey\ndog" | grep -E "cat|dog"
cat
dog
1 1156131 (\.)|rs2887286 C T
1 1211292 (\.)|rs6685064 T C
1 2283896 (\.)|rs2840528 A G
1 1156131 rs2887286 C T
1 1211292 rs6685064 T C
1 2283896 rs2840528 A G
grep -Ef <( awk '{$3 = "(\\.)|" $3}1' template ) file.vcf
grep-Ef我移除了标签;根据标签描述,它用于vCard文件。好的,谢谢你的评论。我删除了标签;根据标签描述,它用于vCard文件。好的,谢谢你的评论。你好像把括号放错地方了。我想应该是(\.\rs2887286)
等等。。。。但是现有的答案IMHO用一个Awk脚本更优雅地解决了这个问题。@triplee如果OP愿意编辑他的模式文件,我觉得它比Awk
解决方案要好,因为它变成了grep-Ef PATTERNFILE file.vcf
。不管怎样,我并没有说这是更好的,这只是另一种可能的考虑:-感谢TrPress和马克的两个答案。我不介意更改模板文件,以使此方法完全符合我的需要。我还认为“唯一的”grep近似是一个更漂亮的解决方案。你似乎把括号放错地方了。我想应该是(\.\rs2887286)
等等。。。。但是现有的答案IMHO用一个Awk脚本更优雅地解决了这个问题。@triplee如果OP愿意编辑他的模式文件,我觉得它比Awk
解决方案要好,因为它变成了grep-Ef PATTERNFILE file.vcf
。不管怎样,我并没有说这是更好的,这只是另一种可能的考虑:-感谢TrPress和马克的两个答案。我不介意更改模板文件,以使此方法完全符合我的需要。我还认为“唯一”的grep近似是一个更漂亮的解决方案。谢谢@thanasisp的回答。你的近似值很有趣,但我认为grep近似值是一个更好的选择。谢谢@thanasisp的回答。你的近似值很有趣,但我认为grep近似值是一个更好的选择。