awk打印存储在数组中的列和前一列

时间:2018-03-09 15:32:18

标签: awk

我有一段代码,它给了我第一个以某种模式开头的专栏" gene"它看起来像那样:

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

因此有些行包含&#34;基因&#34;有些行不包含(我不需要那些),但有些行在前一列中使用&#34; eC_number&#34;提供额外信息。与#34; gene&#34;同名对于不同的基因,可以给出(在极少数情况下),这有助于确定它实际上是哪一个(在第2行和第3行中作出示例)。

是否有一种尴尬的方式说&#34;专栏 - $ 1&#34;打印前一列也是例如包含数组&#34;列&#34;此信息?或者我应该单独检查以&#34; gene&#34;开头的字段。并以&#34; eC-number&#34;?开头?

作为输出,可以包含前一列,无论它是否以&#34; eC_number&#34;或者&#34; ID&#34;,因为之后的清理应该很容易。但是&#34;基因&#34;必须在行中,单独的eC_number没有帮助。

期望的输出:

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

谢谢!

1 个答案:

答案 0 :(得分:2)

这是一个解决方案:

{ # 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