在不知道AWK中确切位置的情况下替换缺失值

H

我正在尝试处理从整体下载GTF / GFF文件。文件的截断版本如下所示:

1   ensembl gene    5273    10061   .   -   .   gene_id ENSGALG00000054818; gene_version 1; gene_source ensembl; gene_biotype protein_coding;
1   ensembl transcript  5273    10061   .   -   .   gene_id ENSGALG00000054818; gene_version 1; transcript_id ENSGALT00000098984; transcript_version 1; gene_source ensembl; gene_biotype protein_coding; transcript_source ensembl; transcript_biotype protein_coding;
1   ensembl gene    58427   58617   .   +   .   gene_id ENSGALG00000047594; gene_version 1; gene_name RF00004; gene_source ensembl; gene_biotype snRNA;
1   ensembl transcript  58427   58617   .   +   .   gene_id ENSGALG00000047594; gene_version 1; transcript_id ENSGALT00000094382; transcript_version 1; gene_name RF00004; gene_source ensembl; gene_biotype snRNA; transcript_name RF00004-201; transcript_source ensembl; transcript_biotype snRNA;
1   ensembl exon    58427   58617   .   +   .   gene_id ENSGALG00000047594; gene_version 1; transcript_id ENSGALT00000094382; transcript_version 1; exon_number 1; gene_name RF00004; gene_source ensembl; gene_biotype snRNA; transcript_name RF00004-201; transcript_source ensembl; transcript_biotype snRNA; exon_id ENSGALE00000460125; exon_version 1;
1   ensembl gene    63264   63454   .   +   .   gene_id ENSGALG00000049206; gene_version 1; gene_name RF00004; gene_source ensembl; gene_biotype snRNA;
1   ensembl transcript  63264   63454   .   +   .   gene_id ENSGALG00000049206; gene_version 1; transcript_id ENSGALT00000092780; transcript_version 1; gene_name RF00004; gene_source ensembl; gene_biotype snRNA; transcript_name RF00004-201; transcript_source ensembl; transcript_biotype snRNA;
1   ensembl exon    63264   63454   .   +   .   gene_id ENSGALG00000049206; gene_version 1; transcript_id ENSGALT00000092780; transcript_version 1; exon_number 1; gene_name RF00004; gene_source ensembl; gene_biotype snRNA; transcript_name RF00004-201; transcript_source ensembl; transcript_biotype snRNA; exon_id ENSGALE00000501941; exon_version 1;

(九个制表符分隔的列。)

在一些行有属性缺少像gene_nametranscript_idtranscript_name

  • 如果gene_name缺少,我想将其替换为gene_id
  • 如果transcript_name丢失了,我想用替换transcript_id(如果丢失,transcript_id则替换为gene_id)。

但是,关于该信息的信息transcript_id或更好地说,此信息的位置是未知的。我将如何查找属性,并在缺少属性的情况下,将其替换为transcript_id位置信息未知的值

我实现替换丢失的价值gene_name与价值gene_id是这样的:

awk '{if (!/gene_name/) print $0, "gene_name " $10; else print $0}' input.gtf > output.gtf

这工作得很好,但这只是因为在这种特殊情况下,我知道用作替换值的位置。当比赛的位置未知时,我不知道该如何实现。

我使用以下代码来获取未知的位置信息,但无法像上面的第一个示例一样集成对失配的检查:

awk '{for (i=1; i<=NF; ++i) { if ($i ~ "transcript_name") print$0,"transcript_name ", $(i+1) } }' input.gtf > output.gtf

条件是,仅当transcript_name行中尚不存在时,才应将其替换为的值transcript_id

我真的很感谢您的帮助!

oguz ismail

使用awk脚本;

script.awk

#!/usr/bin/awk -f
BEGIN {
  FS=OFS="\t"
}
{
  gsub(/; *$/, "", $9)        # trim trailing `;'
  split($9, pairs, / *; */)   # split attributes into pairs
  for (i in pairs) {
    split(pairs[i], kv, / */) # split pair into key and value
    attr[kv[1]] = kv[2]       # add it to `attr'
  }
  # fill missing fields
  if (!("gene_name" in attr))
    attr["gene_name"] = attr["gene_id"]
  if (!("transcript_id" in attr))
    attr["transcript_id"] = attr["gene_id"]
  if (!("transcript_name" in attr))
    attr["transcript_name"] = attr["transcript_id"];
  # recreate the attributes field
  attr_all = sep = ""
  for (k in attr) {
    attr_all = attr_all sep k " " attr[k]
    sep = "; "
  }
  # update the record with new attributes
  $9 = attr_all 
}
1 # print record

用法示例:

awk -f script.awk inputfile

在线演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在不知道其确切类型的情况下更新DbContext中的实体?

在不知道列和行的情况下替换pandas Dataframe中的某些值

是否可以在不知道 arangodb 中的确切结构的情况下索引所有属性?

如何在不知道确切字符串的情况下获取数组中的特定元素

在不知道确切结构的情况下计算大量嵌套的XmlNodes

遗传算法:在不知道确切组数的情况下对学生进行分组

在不知道确切频道的情况下搜索消息 [discord.js]

如何在不知道确切类型的情况下在 Rust 中组合特征操作

在不知道确切的可执行文件名称的情况下,如何找到Linux上程序的安装位置?

如何在不知道程序的确切路径的情况下从 python 脚本级别运行任何程序?

猫鼬-在不知道确切模式的情况下使用现有数据库中的文档进行操作

如何在不知道索引的情况下替换 JavaScript 数组中的特定元素?

如何在不知道确切键的情况下在 Java 中的 JSON 字符串中屏蔽特定值

在不知道树中位置的情况下找到属性

在不知道类型的情况下从文件中读取

在不知道值的情况下检查python中几个变量的不等式

如何在不知道其在Visual Studio中的位置的情况下使用SqlDataReader从选择中获取值

JavaFX FXML 背景图像:如何在不知道确切名称的情况下从文件夹中选择图像?

在不知道确切长度的情况下从大型 csv 中选择行的子集时使用 numpy.random.seed()

如何在不知道小数点后确切位数的情况下将十进制数保存到 mysql 数据库

如何在不知道 Spark 中任何特定值的情况下根据 GroupBy 列的值选择列

如何在不知道当前值的情况下向php中的MySQL SET类型添加可能的值

AngularJS-当我不知道其确切位置时调用数组中的元素

在 JSON 对象中,如何在不知道键的情况下检索 JSON 对象中对象的值?

如何在不知道位置的情况下从嵌套的 json 返回特定的键值对?

在不知道位置的情况下使输入的文本显示在屏幕上

如何在不知道最初输入多少值的情况下将整数存储到数组中

在不知道 Firebase 实时数据库中的键值的情况下检索子值

如何在不知道泛型的情况下获取泛型类(单例)中静态字段的值