【问题标题】:Grep multiple positions with/without IDGrep 多个职位有/没有 ID
【发布时间】:2020-09-04 15:58:01
【问题描述】:

我想 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 和 "."而是:

文件.vcf

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

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

提前致谢

【问题讨论】:

  • 我删除了vcf标签;根据标签描述,它用于 vCard 文件。
  • 好的,感谢您的 cmets。

标签: bash awk grep pattern-matching vcf-variant-call-format


【解决方案1】:

我认为您的意思是文件中的第二个字段可能是 .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 '{$3 = "(\\.)|" $3}1' template

做到这一点:

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

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

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

【讨论】:

  • 你似乎把括号放在了错误的地方。我想应该是(\.|rs2887286) 等。
  • ... 但是现有的答案恕我直言,使用单个 Awk 脚本更优雅地解决了这个问题。
  • @triplee 如果 OP 乐于编辑他的模式文件,我觉得它比 awk 解决方案更好,因为它变成了 grep -Ef PATTERNFILE file.vcf。无论如何,我并没有说它更好,这只是另一种考虑的可能性:-)
  • 感谢 @tripleee 和 Mark 的两个回答。我不介意更改模板文件,因此这种方法完全符合我的需要。我也认为“唯一”的 grep 近似是一个更漂亮的解决方案。
【解决方案2】:

为此使用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

【讨论】:

  • 感谢@thanasisp 的回答。您的近似值很有趣,但我认为 grep 近似值是更好的选择。
猜你喜欢
  • 2019-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-13
  • 1970-01-01
相关资源
最近更新 更多