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 BRE
      grep
      解决方案,只是在这里添加了一个POSIX,
      grep-oE'^gene\[0-9]+'hit.txt>results.txt
      @user3439894
      egrep
      被弃用,取而代之的是
      grep-E
      @user3439894您是对的,弃用并不意味着它不能被使用,它意味着它不应该被使用,因为它已经被其他东西取代,将来可能会被删除。继续使用不推荐的软件就像继续将音乐保存在盒式磁带上。当然,可以忽略我的评论,但阅读本文的其他人必须注意这一点。@user3439894不,这不是我的意见,这是“弃用”一词在软件中的定义。看,等等。。我使用的逻辑与用更新型号的电脑替换电脑不同,它更像是用电脑替换打字机或文字处理器。听起来你觉得,
      egrep
      在某些方面比
      grep-E
      更好,所以如果你愿意,可以继续使用它。当然,这完全是你的选择,我只是提醒你和其他人它被弃用了。