使用正则表达式提取子字符串

use*_*828 -1 awk

我有以下文件:

> 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
Run Code Online (Sandbox Code Playgroud)

我想得到这个输出:

gene.69778
gene.65186
gene.3169
gene.1708
gene.41465
gene.101930
gene.93918
gene.65186
Run Code Online (Sandbox Code Playgroud)

我只能弄清楚awk '$1 ~ /^gene/'。如何获得上述输出?

anu*_*ava 6

你可以使用这个简单的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
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

  • -n: 禁用正常输出
  • -E: 启用扩展正则表达式
  • ^(gene\.[0-9]+)gene.<number>在开始时匹配并在第 1 组中捕获
  • .*: 匹配剩余的字符串
  • \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
Run Code Online (Sandbox Code Playgroud)