我有以下文件:
> 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/'。如何获得上述输出?
你可以使用这个简单的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:反向引用组 #1p: 打印替换的子串或者,这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)