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
,否则可能会将空字段或一系列空字段误认为所需字段。