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

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

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

第 3 种解决方案:在您非常具体的情况下,gene_name总是出现在第 3 场,我们可以尝试这个,对于通用解决方案,请尝试第 1 或第 2 种解决方案。

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_names+(S+).*/1t2/' Input_file


以上是在匹配模式的列旁边打印列的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>