首页 > 解决方案 > 使用正则表达式提取子字符串

问题描述

我有以下文件:

> cat hit.txt | head
gene.69778.3.0.p1
gene.65186.0.2.p1
chr11_pilon3.g961.t1
gene.3169.3.4.p1
chr11_pilon3.g3568.t1
gene.1708.8.0.p1
gene.41465.0.3.p1
chr04_pilon3.g11582.t1
gene.101930.0.1.p1
gene.93918.0.0.p1
gene.65186.8.2.p1

我想得到这个输出:

gene.69778
gene.65186
gene.3169
gene.1708
gene.41465
gene.101930
gene.93918
gene.65186

我只能弄清楚awk '$1 ~ /^gene/'。怎么可能得到上述输出?

标签: awk

解决方案


你可以使用这个简单的sed

sed -nE 's/^(gene\.[0-9]+).*/\1/p' hit.txt

gene.69778
gene.65186
gene.3169
gene.1708
gene.41465
gene.101930
gene.93918
gene.65186

这个怎么运作:

  • -n:禁用正常输出
  • -E: 启用扩展正则表达式
  • ^(gene\.[0-9]+):在第 1 组开始匹配gene.<number>并捕获
  • .*: 匹配剩余字符串
  • \1: 对组 #1 的反向引用
  • p: 打印替换子串

或者,这gnu awk也可以完成这项工作:

awk '/^gene\./ {print gensub(/^(gene\.[0-9]+).*/, "\\1", "1")}' hit.txt

gene.69778
gene.65186
gene.3169
gene.1708
gene.41465
gene.101930
gene.93918
gene.65186

推荐阅读