我有这个选项卡分隔的文件:
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