我有一段代码,它给了我第一个以某种模式开头的专栏" 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
谢谢!
答案 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