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_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

第 4 种解决方案: 使用 sed 请尝试以下操作。

sed -E 's/(\S+).*gene_name\s+(\S+).*/\1\t\2/' Input_file

https://stackoverflow.com/questions/67608136/

相关文章:

c# - 为什么将 List 转换为 Array 而不是在 C# 中引用?

go - 为什么一个空 slice 有 24 个字节?

reactjs - 错误 : Final loader (./node_modules/awesom

javascript - 如何在 VueJS 中处理插槽的 onClick 事件

go - 为什么 math.Pow 的性能比位移差?

azure-devops - Azure DevOps Pipeline 永远停留在 Pending

windows - 将 Systems Internals 列为制造商的 Windows 服务的名称

r - purrr::pluck - 如何获取列表的最后一个元素

typescript - noFallthroughCasesInSwitch - 明确允许失败

firebase - 参数类型 'Object?' 无法分配给参数类型 'Map