【问题标题】:awk print the column stored in an array and the previous columnawk 打印存储在数组中的列和上一列
【发布时间】:2018-03-09 15:32:18
【问题描述】:

我有一段代码给了我以特定模式“基因”开头的第一列,它看起来像这样:

awk -F '\t|;' '{for(i=9;i<=NF;i++){if($i~/^gene=/){column=$i}} print column, column}' file

文件看起来像这样

contig_1    Prodigal:2.6    CDS 28  609 .   +   0   ID=PROKKA_00001;eC_number=1.-.-.-;inference=...;WayMoreColumns
contig_10   Prodigal:2.6    CDS 1031    1813    .   +   0   ID=PROKKA_00015;eC_number=4.2.1.-;gene=caiD_1;inference=...;WayMoreColumns
contig_10   Prodigal:2.6    CDS 1031    1813    .   +   0   ID=PROKKA_00015;eC_number=0.0.0.0;gene=caiD_1;inference=...;WayMoreColumns
contig_10   Prodigal:2.6    CDS 1832    2533    .   -   0   ID=PROKKA_00016;gene=gmuR;inference=...;WayMoreColumns
contig_10   Prodigal:2.6    CDS 43  1014    .   +   0   ID=PROKKA_00014;inference=...;WayMoreColumns

所以有些行包含“基因”,有些不包含(我不需要这些),但有些行在上一列中提供了额外的信息,带有“eC_number”。由于可以为不同的基因(在极少数情况下)给出相同的“基因”名称,这有助于识别它到底是哪一个(在第 2 行和第 3 行中构成示例)。

是否有一种尴尬的方式来说“column - $1”来打印上一列,例如包含数组“列”这个信息?或者我应该单独检查以“gene”开头和以“eC-number”开头的字段?

作为输出,包含上一列是可以的,无论它是以“eC_number”还是“ID”开头,因为之后清理应该很容易。但是“基因”必须在行,单独的eC_number没有帮助。

期望的输出:

eC_number=4.2.1.-   gene=caiD_1
eC_number=0.0.0.0   gene=caiD_1
ID=PROKKA_00016 gene=gmuR

谢谢!

【问题讨论】:

  • 作为一个通用的解决方案,awk 支持 $n 指向字段 n。您可以使用适合您需要的任何计算来构建变量 n,例如 n = column - 1。
  • @setop:这听起来是个不错的建议,但经过我所有的尝试,我只实现了“gene=caiD_1 - 1”之类的东西……你如何使用 $n?我找不到关于它的文档

标签: awk


【解决方案1】:

这里有一个解决方案:

{ # for each line
    col = 0
    for(i=9; i<=NF; i++) { # search
        if($i~/^gene=/) {
            col = i
        }
    }
    if (col>0) { # if found
        print $col, $(col-1) # print column and previous one
    }
}

将其保存到“filter.awk”或其他内容,然后使用:

awk -F '\t|;' -f filter.awk file

【讨论】:

  • 效果很好,谢谢。您能否解释一下脚本中匹配列 {col = i} 和我的 {column = $i} 的不同存储实际上是做什么的?在我的情况下,它会将其分配给一个字段,而在您的情况下,它会保留一个数字,这就是为什么您可以对其执行 i-1 ?
  • 没错。 i 是一个数字,所以 i-1 是有意义的。 $i 是正在处理的当前记录的第 i 个字段的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 1970-01-01
  • 1970-01-01
  • 2017-09-17
  • 2023-02-04
  • 1970-01-01
相关资源
最近更新 更多