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
我想得到这个输出:
gene.69778
gene.65186
gene.3169
gene.1708
gene.41465
gene.101930
gene.93918
gene.65186
我只能弄清楚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
这个怎么运作:
-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
推荐阅读
- ios - iOS 键盘下的空白区域
- java - 无法在 Java 中同时使用 STDIN 和 STDERR 读取程序输出
- c++ - 从文件中读取所有数据
- java - 如何在 Smali 中将 iput-object 布尔值设置为 true?
- ios - 更改焦点上的文本字段
- java - foreach:为什么不能在外面声明元素变量?
- c++ - 在右值和左值引用中创建函数时,有没有办法避免重复代码?
- java - Spring RestTemplate 如何将 POJO 与 application/x-www-form-urlencoded 一起使用?
- php - 在三个相关表中计算几个字段并分组
- c# - 从 Mono 中的 BrowserCapabilitiesFactory 获取“无法使用来自 typeref 的令牌 0100028 解析类型”