【问题标题】:Print column next to the column matching a pattern在匹配模式的列旁边打印列
【发布时间】:2021-05-26 00:51:59
【问题描述】:

我有这个制表符分隔的文件:

gene        1  A  6  gene_name  TP53       B
exon        6  B  2  2          A          gene_name  MYC2  10.0  B
transcript  3  B  B  4          gene_name  ORF1

如何打印第一列以及gene_name 列之后的下一列?如您所见,gene_name 并不总是存在于同一列中。

我不确定如何获得最后一部分:

awk 'BEGIN{OFS="\t"} {print $1, ??}' myFile.tsv

所以,我的预期输出是:

gene TP53
exon MYC2
transcript ORF1

谢谢!

【问题讨论】:

  • 您甚至可以为此使用sedsed -nE 's/^(\S+).*\sgene_name(\s+\S+).*/\1\2/p' file (GNU) (demo)。

标签: awk sed


【解决方案1】:

使用您展示的示例,请尝试以下操作。

第一种解决方案:如果您在单行中有多个 gene_name 值,那么以下可能会有所帮助。

awk 'BEGIN{FS=OFS="\t"} {for(i=1;i<=NF;i++){if($i=="gene_name"){print $1,$(i+1);i++}}}' Input_file

第二个解决方案:如果您只有 1 个gene_name,请使用以下方法。

awk 'BEGIN{FS=OFS="\t"} {for(i=1;i<=NF;i++){if($i=="gene_name"){print $1,$(i+1);next}}}' Input_file

第三种解决方案:在您非常具体的情况下,gene_name 总是出现在第三个领域,我们可以尝试这个,对于通用的尝试第一个或第二个解决方案。

awk 'BEGIN{FS=OFS="\t"} $3=="gene_name"{print $1,$4}' Input_file

或者,如果您想检查倒数第二个字段并打印最后一个字段值,请使用:

awk 'BEGIN{FS=OFS="\t"} $(NF-1)=="gene_name"{print $(NF-1),$NF}' Input_file

第 4 种解决方案:sed 请尝试关注。

sed -E 's/(\S+).*gene_name\s+(\S+).*/\1\t\2/' Input_file

【讨论】:

  • 对于 sed 解决方案可能是 sed -nE 's/\s.*gene_name(\s\S+).*/\1/p' file N.B.在gene_name 之后只有一个\s,否则可能会将一个空字段或一系列空字段误认为是所需的字段。
【解决方案2】:

您可以使用这个gnu awk 解决方案:

awk '{print gensub(/^(\S+).*\tgene_name\t(\S+).*/, "\\1\t\\2", "1")}' file
gene    TP53
exon    MYC2
transcript  ORF1

【讨论】:

    【解决方案3】:

    使用 GNU grep:

    grep -oP '(^\S+)|(\bgene_name\s+\K\S+)' myFile.tsv | paste - -
    

    【讨论】:

      【解决方案4】:
      $ awk -v OFS='\t' '{v=$1; sub(/.* gene_name /,""); print v, $1}' file
      gene    TP53
      exon    MYC2
      transcript      ORF1
      

      【讨论】:

        【解决方案5】:

        还有awk:

        awk -v FS=' .*gene_name | ' '{print $1,$2}' file
        gene TP53
        exon MYC2
        transcript ORF1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-09
          • 1970-01-01
          • 1970-01-01
          • 2021-09-10
          相关资源
          最近更新 更多