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

Awk 打印与模式匹配的列旁边的列,awk,sed,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\u name列后的下一列?如您所见,gene\u name并不总是存在于同一列中 我不确定如何获得这最后一部分: awk '

我有一个单独的标签文件:

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\u name
列后的下一列?如您所见,
gene\u name
并不总是存在于同一列中

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

awk 'BEGIN{OFS="\t"} {print $1, ??}' myFile.tsv
因此,我的预期输出是:

gene TP53
exon MYC2
transcript ORF1

谢谢

对于您展示的样本,请尝试以下内容

awk 'BEGIN{FS=OFS="\t"} {for(i=1;i<=NF;i++){if($i=="gene_name"){print $1,$(i+1);next}}}' Input_file
sed -E 's/(\S+).*gene_name\s+(\S+).*/\1\t\2/' Input_file
第一种解决方案:如果在单行中有多个
gene\u name
值,则以下内容可能会有所帮助

awk 'BEGIN{FS=OFS="\t"} {for(i=1;i<=NF;i++){if($i=="gene_name"){print $1,$(i+1);i++}}}' Input_file
第三种解决方案:对于您的非常特殊的情况,
gene\u 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
请尝试以下方法

awk 'BEGIN{FS=OFS="\t"} {for(i=1;i<=NF;i++){if($i=="gene_name"){print $1,$(i+1);next}}}' Input_file
sed -E 's/(\S+).*gene_name\s+(\S+).*/\1\t\2/' Input_file

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

awk'{print gensub(/^(\S+).*\t gene\u name\t(\S+).*/,“\\1\t\\2”,“1”)}文件
TP53基因
外显子MYC2
转录本ORF1
使用GNU grep:

grep-oP'(^\S+)|(\bgene\u name\S+\K\S+)myFile.tsv|粘贴--

awk

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

您甚至可以为此使用
sed
sed-nE的/^(\s+).*\sgene_名称(\s+\s+).*/\1\2/p文件
(GNU)()。对于sed解决方案,可能是
sed-nE的s/\s.*基因_名称(\s\s+).*/\1/p'文件
N.B.
gene\u name
后面只有一个
\s
,否则可能会将空字段或一系列空字段误认为所需字段。