Awk 用正则表达式提取子串
我有以下文件:Awk 用正则表达式提取子串,awk,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 我想得到这个输出
> 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 -F. '$1 == "gene"{print $1"."$2}' hit.txt > results.txt
字段分隔符设置为一个点,如果字段1等于gene
,则字段1和2中的值用一个点连接并打印
见:
s='gene.69778.3.0.p1
基因65186.0.2.p1
chr11_pilon3.g961.t1
基因3169.3.4.p1
chr11_pilon3.g3568.t1
基因1708.8.0.p1
基因41465.0.3.p1
chr04_pilon3.g11582.t1
基因101930.0.1.p1
基因93918.0.0.p1
基因65186.8.2.p1
'
awk-F.'$1==“gene”{print$1.“$2}”results.txt
看。详情:
-字符串的开头^
-基因\.
基因。
-一个或多个数字[0-9]\{1,\}
- 您可以使用这个简单的
sed
:
sed-nE的/^(基因\[0-9]+)./\1/p'hit.txt
基因69778
基因65186
基因3169
基因1708
基因41465
基因101930
基因93918
基因65186
工作原理:
:禁用正常输出-n
:启用扩展正则表达式-E
:在开始时匹配^(基因\[0-9]+)
并在组1中捕获基因。
:匹配剩余字符串*
:返回对组1的引用\1
:打印替换的子字符串p
或者,此
gnu awk
也可以执行以下操作:
awk'/^gene\./{print gensub(/^(gene\[0-9]+).*/,“\\1”,“1”)}hit.txt
基因69778
基因65186
基因3169
基因1708
基因41465
基因101930
基因93918
基因65186
使用任何awk:
$ awk 'match($0,/^gene\.[^.]+/){print substr($0,RSTART,RLENGTH)}' file
gene.69778
gene.65186
gene.3169
gene.1708
gene.41465
gene.101930
gene.93918
gene.65186
同样在GNU
awk
中,使用带有可选第四个参数的split()
函数保存字段分隔符的文本
awk '$0 ~ /^gene/ {split($0,a,/\./,sep);print a[1]sep[1]a[2]}' file
gene.69778
gene.65186
gene.3169
gene.1708
gene.41465
gene.101930
gene.93918
gene.65186
使用(
egrep
)更容易,使用:egrep-o'^gene\[0-9]+'file>newfile
@user3439894是的,我的答案中还有一个POSIX BREgrep
解决方案,只是在这里添加了一个POSIX,grep-oE'^gene\[0-9]+'hit.txt>results.txt
@user3439894egrep
被弃用,取而代之的是grep-E
@user3439894您是对的,弃用并不意味着它不能被使用,它意味着它不应该被使用,因为它已经被其他东西取代,将来可能会被删除。继续使用不推荐的软件就像继续将音乐保存在盒式磁带上。当然,可以忽略我的评论,但阅读本文的其他人必须注意这一点。@user3439894不,这不是我的意见,这是“弃用”一词在软件中的定义。看,等等。。我使用的逻辑与用更新型号的电脑替换电脑不同,它更像是用电脑替换打字机或文字处理器。听起来你觉得,egrep
在某些方面比grep-E
更好,所以如果你愿意,可以继续使用它。当然,这完全是你的选择,我只是提醒你和其他人它被弃用了。