打印与模式匹配的列旁边的列

  • 本文关键字:打印 模式匹配 awk sed
  • 更新时间 :
  • 英文 :


我有这个选项卡分隔的文件:

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

谢谢!

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

第一个解决方案: 如果您在一行中有多个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

第四个解决方案:使用sed,请尝试以下操作。

sed -E 's/(S+).*gene_names+(S+).*/1t2/' Input_file

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

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

使用GNU grep:

grep -oP '(^S+)|(bgene_names+KS+)' myFile.tsv | paste - -
$ awk -v OFS='t' '{v=$1; sub(/.* gene_name /,""); print v, $1}' file
gene    TP53
exon    MYC2
transcript      ORF1

还有awk:

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

最新更新