Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Grep有/没有ID的多个职位_Bash_Awk_Grep_Pattern Matching_Vcf Variant Call Format - Fatal编程技术网

Bash Grep有/没有ID的多个职位

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一个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"
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近似值是一个更好的选择。